2016-05-10 7 views
0

Недавно я ударил тонкую ошибку в моем коде, связанном с вызовами и обещаниями 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!"); 
    }) 

ответ

0

Вы ошибаетесь в обещаниях, потому что обещания Promise разрешают и отклоняют в itsef;

когда вы делаете это

Promise.resolve($.ajax(...)) //an ajax call which will reject 
.catch(function(err){ 
    err.catch(function(err2){ 
     if (err===err2) console.log("AJAX error rejects with itself as a reason!"); 
    }); 
}); 

вы разрешает любой результат JQuery Ajax вызова, и он всегда будет работать нормально, и вы Н.Р.

+0

Прежде всего, я совершил ошибку во втором блоке кода выше, и должен использовать '.then (null, ...)', а не '.catch (...)'. Во-вторых, я разрешил возвращенный объект в функции catch, поэтому объект 'err' все еще доступен внутри вложенного блока catch, поэтому я могу их сравнить. Конечно, я могу вернуть значение ошибки и разрешить его в качестве обещания, а затем отклонить, но тогда 'err' не будет доступен, если я не сохраню его во внешнем закрытии. –

Смежные вопросы