簡體   English   中英

有什么辦法可以在node.js的Promise中拋出錯誤嗎?

[英]Is it any way to throw errors inside promises in node.js?

js古魯斯

我正在用nodejs(實際上是iojs)編寫一個解析器,並且我有一個典型的以承諾處理的厄運回調金字塔。 花了我70%的時間的問題是在承諾中發現錯誤。

    function parseHomeData(home, web) {
      var deferred = Q.defer();
      var homepage = web.url(home).then(function () {
// any error here dies silently
        parser.getHomeInfo(homepage).then(function (parsedHome) {
            console.log(parsedHome);
            deferred.resolve(parsedHome);

        }, function (err) {
            console.log(err);
            throw new Error(err);
        });
    }, function (err) {
        console.log(err);
    });
    return deferred.promise;
};

如果我不評論“這里的任何錯誤都悄無聲息地消失了”,它將成功。 唯一的方法是將try / catch塊包裝起來,但是即使在那里,我也只能console.log(error)拋出新錯誤。 是否可以通過自動失敗選項運行iojs? 謝謝

承諾捕獲異常並將其變為拒絕。 因此,如果您在.then()處理函數中並且拋出異常,則該異常將產生與返回拒絕的諾言相同的結果。 這就是諾言的工作方式。

因此,要使代碼正常工作,您只需要返回web.url()正在創建的實際承諾web.url() 這也將擺脫不必要的一些反模式,而這些模式在您不必要地創建諾言的地方。

function parseHomeData(home, web) {
    return web.url(home).then(function () {
        // any exception error here becomes the rejected promise
        return parser.getHomeInfo(homepage).then(function (parsedHome) {
            console.log(parsedHome);
            return parsedHome;
        }, function (err) {
            // this handler is only needed if you need the console.log(err) here
            console.log(err);
            throw new Error(err);
        });
    }, function (err) {
        // this handler is only needed if you need the console.log(err) here
        console.log(err);
        throw err;
    });
};

實際上,如果沒有console.log()語句,則所有代碼都可能會崩潰:

function parseHomeData(home, web) {
    return web.url(home).then(parser.getHomeInfo.bind(parser));
}

此代碼塊結合了幾件事:

  1. 返回web.url()承諾,因此,如果由於任何原因(例如, .then()處理程序中的拋出.then()而被拒絕,則將從parseHomeData()函數中將其作為拒絕的承諾返回。

  2. 當您已經有了Q承諾時,無需創建自己的Q承諾就可以返回。

  3. 一旦實現了上面的1)和2),那么就可以從.then()處理程序中返回或拋出,而不是resolve()reject()

您可以在以下參考資料中了解有關諾言反模式的更多信息:

無極反模式(Bluebird github)

無極反模式(Tao代碼)

承諾模式和反模式

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM