为什么jQuery's的promise有一个done(),但是Javascript'Mozilla记录的

Why does jQuery's promise have a done(), but Javascript's promise documented by Mozilla does not? What if I want to have a done() in JS?

本文关键字:但是 Javascript 记录 Mozilla 有一个 jQuery promise 为什么 done      更新时间:2023-09-26

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

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

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

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

根据我对jQuery文档的阅读,ES6then相当于jQuery done

实际上有很多promise库,但对我来说,ES6库是最容易理解的。你只需要"then"answers"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过于庞大,早于promise库。一旦他们意识到承诺有多有用,他们就添加了then(或以前的pipe)方法,但未能100%正确。

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

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

如果我想在JavaScript中拥有done()功能,该怎么办?我该怎么办?

好吧,你可以自己实现:

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

但正如你从中看到的,它实际上并不是很有用。它不连锁,并且忽略异常,所以您应该在任何地方都使用then

我可以解释为什么ES6没有.done。然而,您仍然可以拥有类似于.done的东西。

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

第一个then处理成功响应,但不会用yourPromiseObject的函数rejects或throw异常来调用。第二个捕获对于"解决"任何异常/拒绝都至关重要(简而言之,您告诉promise对象继续运行,您知道存在错误)。确保返回有效的内容,即使是像failureHandler这样简单的内容,也只包含return 0。现在保证调用最后一个.then,所以这就是您的.done

相关文章: