2017-08-15 158 views
0

無法理解爲什麼行爲不同。 在這個版本中一切正常:奇怪的未處理承諾拒絕

const debug = require("debug")("m"); 

const promise = new Promise((resolve, reject) => { 
    setTimeout(() => { 
     reject("promise rejected"); 
    }, 1000); 
}); 

promise.then(
    v => { 
     debug("resolve", v); 
    }, 
    e => { 
     debug("reject", e); 
    }, 
); 

把一個catch處理程序,而不是拒絕處理程序:

const debug = require("debug")("m"); 

const promise = new Promise((resolve, reject) => { 
    setTimeout(() => { 
     reject("promise rejected"); 
    }, 1000); 
}); 

promise.then(v => { 
    debug("resolve", v); 
}); 

promise.catch(e => { 
    debug("catch: ", e); 
}) 

的工作方式相同,但警示的NodeJS UnhandledPromiseRejectionWarning。如何理解這一點?

回答

2

關於thencatch的關鍵之一是他們創造了新的承諾。 (請參見the Promises/A+ spec *和the JavaScript spec [「NewPromiseCapability」是規範中「創建新承諾」的說法]。)第二個示例中承諾then處理程序正在拒絕,因爲其基礎承諾被拒絕,拒絕從不處理。

的常用方法有catch做到這將是一個鏈條:

promise 
    .then(v => { 
     debug("resolve", v); 
    }) 
    .catch(e => { 
     debug("catch: ", e); 
    }); 

這樣一來,沒有未處理的排斥(以及then回調拋出,如果有的話,錯誤傳播的排斥反應catch)。


*承諾/ A +允許then返回了同樣的承諾所提供的實施滿足所有其他要求,但JavaScript的承諾沒有。

+0

謝謝。我在「Promises/A + spec」中找到:2.2.7.4如果onRejected不是一個函數,並且promise1被拒絕,promise2必須被拒絕,原因與promise1相同。 – tilin

相關問題