Promise中的.done是什么?

时间:2017-03-22 13:44:19

标签: javascript promise

我正在学习JS Promise,并且我注意到使用A = [3, 3, 6, 1, 2] m = 10**9 + 7 r = 1 for x in A: r = (r * (1 + pow(2, x, m))) % m print r 的一些代码示例是他们最后追加Promise。我已经检查了Promise api,但无法找到有关它的任何信息。我的假设是它在.done语句中的作用类似于finally,无论Promise返回什么,它都会被调用。我一直在寻找,但无法找到答案。

所以我的问题是,它是否与Promise一起构建,它基本上做了什么?

跟进问题

如果try...catch在香草JS中不存在,有没有办法模仿这个" catch-all"功能

修改

很抱歉,我的错误不包括在ES6 Promise规范中,所以我删除了ES6标签。

2 个答案:

答案 0 :(得分:2)

如果您正在查看jQuery deferred示例,则可能会看到使用done的示例。

如果您正在查看bluebird示例,则可能会看到使用done的示例。

我确信还有其他库公开.done()作为其承诺API的一部分,但重要的是要知道与Promises / A +兼容并且通常作为增强功能添加。

这也意味着我无法充分告诉您.done()将会做什么,因为它完全取决于用于确切实施的库。

另一个特定于jQuery的注释:jQuery的延迟实现优先于Promises / A +规范,因此在jQuery v3之前,大多数库都不是A +兼容。

答案 1 :(得分:2)

一些promise库有.done()方法,其主要目的是捕获并重新抛出任何未处理的错误,以便它们显示在控制台中(在浏览器中)或在Node中崩溃。我怀疑这就是为什么你经常在承诺链的末尾看到它。

在Q和bluebird中,它接受履行和拒绝处理程序,但由于它返回undefined,因此它不能被链接到更远的地方。 bluebird文档不鼓励使用它,并表示它仅用于历史目的,因为bluebird提供了更优雅的方法来处理未处理的错误。

来自the Q documentation

  

就像那时一样,但是在未处理的拒绝方面有不同的行为。如果存在未处理的拒绝,或者因为promise被拒绝而没有提供onRejected回调,或者因为onFulfilled或onRejected引发了错误或返回了被拒绝的promise,则在事件循环的未来转向中抛出所得到的拒绝原因作为异常

     

此方法应该用于终止不会传递到别处的promises链。由于在回调中抛出的异常被消耗并转换为拒绝,因此链末端的异常很容易被意外地,无声地忽略。通过安排在事件循环的未来转向中抛出异常,以便它不会被捕获,它会导致浏览器窗口上的onerror事件或Node.js上的uncaughtException事件。过程对象。

     

如果Q.longStackSupport设置为true,则由done抛出的异常将具有长堆栈跟踪。如果设置了Q.onerror,那么异常将在那里传递而不是在将来的回合中抛出。

     

完成与使用的黄金法则是:将您的承诺退还给其他人,或者如果链条以您结束,则调用完成以终止它。使用catch终止是不够的,因为catch处理程序本身可能会抛出错误。

Re:有没有办法模仿这个全能函数?

以下内容应该可以解决问题:

if (!Promise.prototype.done) {
    Promise.prototype.done = function (onfulfilled, onrejected, onprogress) {
        this.then(onfulfilled, onrejected, onprogress)
            .catch(function (error) {
                setTimeout(function () { throw error; }, 0);
            });
    };
}