Недавно я ударил тонкую ошибку в моем коде, связанном с вызовами и обещаниями jQuery AJAX. Короче говоря, что код делает, было эквивалентно:Почему возвращенная «причина» от отклоненного jQuery AJAX-вызова тогда возможна?
Promise
.resolve($.ajax(...))
.catch(function(err){return err})
.then(function(response){//do something with response}
Причины делать это неважны прямо сейчас, и, конечно же, было много других частей обещание цепи, не перечисленные выше, не Релевент к проблеме , То, что я хотел, было причиной отказа от вызова AJAX, чтобы закончить на разрешенном пути, однако он каждый раз отказывался от него отказываться.
В конце концов я обнаружил, что ответ, полученный от отклоненного вызова JQuery AJAX, имеет метод then, который будет отклонять с себя в качестве причины. Должно быть ясно:
Promise.resolve($.ajax(...)) //an ajax call which will reject
.catch(function(err){
err.then(null,function(err2){
if (err===err2) console.log("AJAX error rejects with itself as a reason!");
});
});
зарегистрирует сообщение, предоставленное на консоли.
Вопрос в том, почему это было сделано? Есть ли веская причина для возвращенной причины для отвергнутого обетования самому себе тогда? Кроме того, есть веские основания, а также то, что это может отказаться от самого себя в качестве причины?
Чтобы избежать путаницы, ниже второго кодового блока, переписана, чтобы использовать один и тот же прикован стиль в качестве первого блока и внешней переменной для хранения возвращенный ошибку.
var reason;
Promise
.resolve($.ajax(...))
.catch(function(err){
reason=err;
return err
})
.then(function(response){//will not be called if the ajax rejects}
.catch(function(err){
if (err===reason) console.log("AJAX error rejects with itself as a reason!");
})
Прежде всего, я совершил ошибку во втором блоке кода выше, и должен использовать '.then (null, ...)', а не '.catch (...)'. Во-вторых, я разрешил возвращенный объект в функции catch, поэтому объект 'err' все еще доступен внутри вложенного блока catch, поэтому я могу их сравнить. Конечно, я могу вернуть значение ошибки и разрешить его в качестве обещания, а затем отклонить, но тогда 'err' не будет доступен, если я не сохраню его во внешнем закрытии. –