为什么jQuery的承诺有一个done(),但Mozilla记录的Javascript承诺不是? 如果我想在JS中有一个done()怎么办?

Mozilla的JavaScript文档的Promises(参见API页面 )和jQuery的Promises(参见API页面 )之间有什么区别?

Mozilla的承诺似乎只有两种方法:然后捕获。 jQuery的承诺似乎有更多的方法,包括:then,done和fail。 ( 从这里 )

为什么Mozilla上的JS API没有done() 如果我想在JavaScript中使用done()function怎么办? 我该怎么办?

Mozilla的javascript承诺基于ES6标准 ,而jQuery承诺是在ES6发布之前创建的。

根据我对jQuery文档的阅读,ES6等同于done jQuery。

实际上有一大堆承诺库,但对我来说,ES6是最容易理解的。 您不需要“then”和“catch”,并且很容易将它们链接到一系列操作中。 使用Promise.all添加到并行任务中,并且涵盖了所需内容的99%。

 return doSomething().then(function(result) { return doSomethingElse(result); }).then(function(secondResult) { return doThirdSomething(secondResult); }).catch(function(err) { console.log(err); }).then(function(finalResult) { // a then after a catch is like a "finally" or "always" return finalResult; }); 

jQuery支持的一些不在ES6中的东西是某种“进步”决心。

jQuery的延迟API是膨胀的,早于承诺库。 一旦他们意识到承诺是多么有用,他们就会添加一个then (或者说是普遍的pipe )方法,但是他们却没有100%正确 。

为什么Mozilla上的JS API没有done()

这完全没必要。 所有Promises / A +兼容的实现 (包括ES6)只需要一个方法: .then() 。 它完全是普遍的,你可以用它做任何事情 – 它是承诺的原始 。

如果我想在JavaScript中使用done()function怎么办? 我该怎么办?

好吧,你可以自己实现它:

 Promise.prototype.done = function(cb) { // or function(...cbs) for (let cb of cbs) … this.then(cb).then(null, function(err) { /* ignore */ }); return this; }; 

但正如你从中可以看到的那样,它实际上并不是很有用。 它没有链,它忽略了exception,所以你应该随处使用。

我可以代表为什么ES6没有.done 。 但是,你仍然可以拥有类似于.done东西。

 yourPromiseObject.then(successHandler).catch(failureHandler).then(doneHandler); 

第一个then处理成功响应,但不会使用yourPromiseObject的函数拒绝或抛出exception来调用。 第二个问题对于“解决”任何exception/拒绝至关重要(简而言之,您告诉承诺对象继续前进,您知道存在错误)。 确保你返回一些有效的东西,即使是一个简单的事情,因为failureHandler包含一个return 0就可以了。 现在保证最后的.then被调用,所以这是你的.done