使用bluebird承诺进行异步异常处理

使用bluebird承诺进行异步异常处理

处理此方案的最佳方法是什么。我处于受控环境中,我不想崩溃。

var Promise = require('bluebird');function getPromise(){
    return new Promise(function(done, reject){
        setTimeout(function(){
                throw new Error("AJAJAJA");
        }, 500);
    });}var p = getPromise();
    p.then(function(){
        console.log("Yay");
    }).error(function(e){
        console.log("Rejected",e);
    }).catch(Error, function(e){
        console.log("Error",e);
    }).catch(function(e){
        console.log("Unknown", e);
    });

从setTimeout中抛出时,我们总是得到:

$ node bluebird.js

c:\blp\rplus\bbcode\scratchboard\bluebird.js:6
                throw new Error("AJAJAJA");
                      ^Error: AJAJAJA
    at null._onTimeout (c:\blp\rplus\bbcode\scratchboard\bluebird.js:6:23)
    at Timer.listOnTimeout [as ontimeout] (timers.js:110:15)

如果抛出发生在setTimeout之前,那么bluebirds catch会把它拿起来:

var Promise = require('bluebird');function getPromise(){

    return new Promise(function(done, reject){
        throw new Error("Oh no!");
        setTimeout(function(){
            console.log("hihihihi")
        }, 500);
    });}var p = getPromise();
    p.then(function(){
        console.log("Yay");
    }).error(function(e){
        console.log("Rejected",e);
    }).catch(Error, function(e){
        console.log("Error",e);
    }).catch(function(e){
        console.log("Unknown", e);
    });

结果是:

$ node bluebird.jsError [Error: Oh no!]

哪个好 - 但是如何在节点或浏览器中处理这种性质的流氓异步回调。


慕慕森
浏览 818回答 2
2回答

开满天机

现在我知道promise在异步回调中没有捕获错误。这是我测试的3个例子。注意:拒绝呼叫后,功能将继续运行。示例1:拒绝,然后在promise构造函数回调中抛出错误示例2:拒绝,然后在setTimeout异步回调中抛出错误示例3:拒绝,然后返回setTimeout异步回调以避免崩溃// Caught// only error 1 is sent// error 2 is reached but not send reject againnew Promise((resolve, reject) => {   reject("error 1"); // Send reject   console.log("Continue"); // Print    throw new Error("error 2"); // Nothing happen})   .then(() => {})   .catch(err => {     console.log("Error", err);   });// Uncaught// error due to throw new Error() in setTimeout async callback// solution: return after rejectnew Promise((resolve, reject) => {   setTimeout(() => {     reject("error 1"); // Send reject     console.log("Continue"); // Print     throw new Error("error 2"); // Did run and cause Uncaught error   }, 0);})   .then(data => {})   .catch(err => {     console.log("Error", err);   });// Caught// Only error 1 is sent// error 2 cannot be reached but can cause potential uncaught error if err = nullnew Promise((resolve, reject) => {   setTimeout(() => {     const err = "error 1";     if (err) {       reject(err); // Send reject       console.log("Continue"); // Did print       return;     }     throw new Error("error 2"); // Potential Uncaught error if err = null   }, 0);})   .then(data => {})   .catch(err => {     console.log("Error", err);   });
打开App,查看更多内容
随时随地看视频慕课网APP