Differences between Deferred.then(null,func) and D

2019-03-03 12:35发布

问题:

I found out today that Deferred.then(null,func) and Deferred.fail(func) aren't the same thing in JQuery. In ES6's promise, Promise.then(null,func) and Promise.catch(func) are the same thing, so I was confused by JQuery's functions.

The only difference I know of is this:

$.Deferred().reject().promise()
  .fail(function(){
    return $.Deferred().resolve().promise();
  })
  .then(function(){
    console.log('fail caught error'); // NOT printed
  });

$.Deferred().reject().promise()
  .then(null,function(){
    return $.Deferred().resolve().promise();
  })
  .then(function(){
    console.log('then caught error'); //printed
  });

Are there any other useful differences?

回答1:

Yes, the difference between them is that .fail() does return the original promise it was called upon while .then() does construct a new promise which might resolve with a different value.

However, due to jQuery's problematic error handling you won't notice this unless you return a promise from your callback, like you do in your example. It would be much more of a problem if you had compared fail to a standard-adhering catch invocation.