鑑於以下代碼:爲什麼不承諾異步操作拋出錯誤?
var fs = require('fs');
var asyncErrorPromise = new Promise(function(resolve) {
fs.readFile('does/not/exist.blah', function(fileError, content) {
if (fileError) throw fileError;
resolve(content);
});
});
asyncErrorPromise
.then(function(content) {
console.log('content received: ' + content);
})
.catch(function(err) {
console.log('error received: ' + err.name);
});
我期望時,拋出(因爲我嘗試加載不存在的文件)將被無極捕獲和漏斗進入.catch()
聲明fileError
。所以最後我會得到這個輸出:error received: ENOENT
。
然而,當我運行此代碼,我得到以下代替:
if (err) throw err;
^
Error: ENOENT: no such file or directory, open 'does/not/exist.blah'
at Error (native)
所以未能逮住錯誤:它扔了,就像通常那樣,就好像它是一個承諾之外。
這是怎麼發生的?
我所能找到的關於Promise的所有內容都更關注錯誤被吞噬了,而不是這個問題,當它不需要的時候它會拋出!
以及應該如何我在這裏達到我的目的?我是否需要使用try-catch語句和reject
處理程序?
正如你所提到的,你需要抓住並拒絕/推遲承諾。任何未捕獲的異常都將由引擎處理並停止腳本。 – Baski
你爲什麼要抓住錯誤?簡單地拒絕它 –
你使用什麼承諾lib?在ES6中,在一個新的promise構造函數中拋出的錯誤應該隱含地拒絕這個promise,所以你的代碼應該工作,假設承諾實現是ES6 compat。 – ehynds