我正在学习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标签。
答案 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提供了更优雅的方法来处理未处理的错误。
就像那时一样,但是在未处理的拒绝方面有不同的行为。如果存在未处理的拒绝,或者因为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);
});
};
}