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 中出現的錯誤會被做爲異常拋出
二、終結 Promise chainprototype