我正在学习JS Promise,我注意到一些使用Promise
的代码示例是它们在末尾附加.done
。我检查了Promise api,但是找不到有关它的任何信息。我的假设是,它的作用类似于finally
语句中的try...catch
,无论Promise返回什么,它都会被调用。我到处都在搜索,但找不到答案。
所以我的问题是,它是否内置在Promise中,它的基本作用是什么?
后续问题
如果香草JS中不存在.done()
,是否可以模拟此“包罗万象”功能?
编辑
抱歉,这不包含在ES6 Promise规范中,因此我要删除ES6标签。
最佳答案
一些Promise库具有.done()
方法,其主要目的是捕获并抛出所有未处理的错误,以便它们显示在控制台中(在浏览器中)或使Node中的进程崩溃。我怀疑这就是为什么您经常在承诺链的末端看到它的原因。
在Q和bluebird中,它接受已实现和拒绝处理程序,但是由于它返回undefined
,因此不能将其链接得更远。蓝鸟文档不鼓励使用它,并说它仅用于历史目的,因为蓝鸟提供了更优雅的方式来处理未处理的错误。
从the Q documentation:
类似于那时,但是围绕未处理的拒绝具有不同的行为。如果存在未处理的拒绝,或者是由于拒绝了Promise而没有提供onRejected回调,或者是因为onFulfilled或onRejected抛出了错误或返回了拒绝的Promise,所以导致的拒绝原因在以后的事件循环中被抛出为异常。 。
此方法应用于终止不会在其他地方传递的承诺链。由于引发回调的异常被消耗并转换为拒绝,因此链末尾的异常很容易被意外地,无声地忽略。通过安排在以后的事件循环中引发该异常以使其不被捕获,它会在浏览器窗口上引发onerror事件,或在Node.js的流程对象上引发uncaughtException事件。
如果Q.longStackSupport设置为true,则done引发的异常将具有很长的堆栈跟踪。如果设置了Q.onerror,异常将在那里传递而不是在以后的回合中抛出。
完成与之后使用的黄金法则是:要么将您的承诺返还给其他人,要么,如果链条以您结尾,请致电完成以终止它。用catch终止是不够的,因为catch处理程序本身可能会引发错误。
回复:有没有办法模仿这种万能的功能?
如下所示的方法可以解决问题:
if (!Promise.prototype.done) {
Promise.prototype.done = function (onfulfilled, onrejected, onprogress) {
this.then(onfulfilled, onrejected, onprogress)
.catch(function (error) {
setTimeout(function () { throw error; }, 0);
});
};
}
关于javascript - Promise中的.done是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42953447/