Promise.prototype.done

promise設計規格並無對 Promise.prototype.done作出任何規定,所以在使用的時候,你能夠使用已有類庫提供的實現,也能夠本身去實現。promise

做用

不管Promise對象的回調鏈以then方法仍是catch結尾,只要最後一個方法拋出錯誤,就有可能沒法捕捉到(由於Promise內部的錯誤不會冒泡到全局),所以,須要提供一個done方法,它老是處於回調鏈的尾端(被執行),保證拋出任何可能出現的錯誤;this

示例代碼

"use strict";
if (typeof Promise.prototype.done === "undefined") {
    Promise.prototype.done = function (onFulfilled, onRejected) {
        this.then(onFulfilled, onRejected).catch(function (error) {
            setTimeout(function () {
                throw error;
            }, 0);
        });
    };
}

done 有如下兩個特色

一、done 中出現的錯誤會被做爲異常拋出
二、終結 Promise chainprototype