我正在学习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/

10-12 00:09
查看更多