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

时间:2015-12-22 02:41:09

标签: javascript jquery angularjs promise

Mozilla的JavaScript文档与#39;之间有什么区别?承诺(见API page)和jQuery的承诺(见API page)?

Mozilla的承诺似乎只有两种方法:然后抓住。 jQuery的承诺似乎有更多的方法,包括:then,done和fail。 (from here

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

3 个答案:

答案 0 :(得分:3)

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

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

实际上有一大堆承诺库,但对我来说ES6是最容易理解的。你不需要超过"然后"并且"赶上"并且很容易将一起链接到一系列操作中。使用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中的东西是某种"进步"解决。

答案 1 :(得分:3)

jQuery的deferred API臃肿并早于承诺库。一旦他们意识到承诺有多么有用,他们就会添加done()(或previosly, pipe)方法,但它they failed to get it 100% right

  

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

完全没必要。所有Promises/A+ compatible implementations(包括ES6)只需要一个方法:done()。这是完全普遍的,你可以用它做任何事情 - 这是承诺的primitive

  

如果我想在JavaScript中使用Promise.prototype.done = function(cb) { // or function(...cbs) for (let cb of cbs) … this.then(cb).then(null, function(err) { /* ignore */ }); return this; }; 功能该怎么办?我该怎么办?

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

then

但正如你从中可以看到的那样,它实际上并不是很有用。它不会链接,它会忽略异常,所以你应该只在任何地方使用$final = $PropMgr.GetValue($section, $property) $final = $ExecutionContext.InvokeCommand.ExpandString($final)

答案 2 :(得分:0)

我可以说ES6为什么没有.done。但是,您仍然可以使用类似.done的内容。

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

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