如何处理错误与承诺? [英] How do I handle errors with promises?

查看:178
本文介绍了如何处理错误与承诺?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

作为节点编程人员。我习惯于使用nodebacks来处理我的代码中的错误:

  myFn(param,function(err,data) {
if(err){
//错误处理逻辑
}
else {
//业务逻辑
}
});

撰写该功能时,我可以执行以下操作:

  var myFn = function(param,callback){
var calc = doSomeCalculation(param);
if(calc === null){//或其他方式检测错误
回调(new Error(error with calculate),null);
}
...
someAsyncOp(calcN,function(err,finalResult){
if(err)return callback(err,null);
callback ,finalResult); //错误为null,表示没有错误
});

};

如何使用承诺进行这种错误处理?

解决方案

Thumb的规则



每当你对如何做某些事情有所承诺时,同步版本。

  try {
var result = myFn(param);
//业务逻辑与结果
} catch(e){
//错误处理逻辑
}

这个,至少对我看起来比一个有时候 null 的第一个参数的回调更干净。 p>

承诺方式几乎总是与同步版本的问题非常相似:

  myFn(param).then(function(result){
//业务逻辑,结果为
})catch(function(e){
//错误处理逻辑
});

myFn看起来像处理回调时的情况:

  var myFn = function(param){
return new Promise(function(resolve,reject){
var calc = doSomeCalculation(param);
if(calc === null){//或其他一些检测错误的方法
reject(new Error(error with calculate),null);
}
someAsyncOp (calcN,function(err,finalResult){
if(err)reject(err);
resolve(finalResult);
})
});
};



使用回调/节点回退



在使用回调时,只需要处理回调时你应该做的事情,当使用承诺更简单时,您可以执行以下操作:

  var myFn = function(param){
var calc = doSomeCalculation(param);
...
返回someAsyncOp(calcN); //返回承诺
}

此外,当在承诺链中工作时,您会得到安全性:

  myFn(param).then(function(calcN){
//这里,你抛出一个错误并返回解决
//新的Promise应该仅在启动链时使用
})。catch(function(err){
// handle error
})然后(function (){
//准备再次出现,我们离开了
});






请注意,像 蓝鸟 RSVP Q 提供语法糖和方法的自动承诺,所以你很少必须自己使用新的Promise



此外,请考虑阅读 以了解有关承诺错误处理的更多信息。


As a node programmer. I'm used to use "nodebacks" for handling errors in my code:

myFn(param, function(err, data) {
    if (err){
        //error handling logic
     }
     else {
        // business logic
    }
});

When writing that function, I can do something like:

var myFn = function(param, callback){
    var calc = doSomeCalculation(param);
    if(calc === null) { // or some other way to detect error
        callback(new Error("error with calculation"), null);
    }
    ...
    someAsyncOp(calcN,function(err, finalResult){
        if(err) return callback(err, null);
        callback(null, finalResult); // the error is null to signal no error
    });

};

How would I do this sort of error handling with promises?

解决方案

Rule of Thumb

Whenever you have a doubt about how to do something with promises - think about the synchronous version.

try{
   var result = myFn(param);
   // business logic with result
} catch(e) {
    //error handling logic
}

This, at least to me looks a lot cleaner than a callback with a first parameter that is sometimes null.

The promises way is almost always very similar to the synchronous version of the problem:

myFn(param).then(function(result){
    // business logic with result
}).catch(function(e){
    //error handling logic
});

Where myFn would look something like when working with callbacks:

var myFn = function(param){
    return new Promise(function(resolve, reject){
        var calc = doSomeCalculation(param);
        if(calc === null) { // or some other way to detect error
            reject(new Error("error with calculation"), null);
        }
        someAsyncOp(calcN,function(err, finalResult){
            if(err) reject(err);
            resolve(finalResult);
        })
    });
};

Working with callbacks/nodebacks

This is only something you should have to do when working with callbacks, when working with promises it is a lot simpler, and you can do:

var myFn = function(param){
    var calc = doSomeCalculation(param);
    ...
    return someAsyncOp(calcN); // returning a promise.
}

Moreover, when working inside promise chains, you get throw safety:

myFn(param).then(function(calcN){
   // here, you throw to raise an error and return to resolve
   // new Promise should be used only when starting a chain.
}).catch(function(err){
    // handle error
}).then(function(){
   // ready to go again, we're out of the catch
});


Note, some libraries like Bluebird , RSVP and Q offer syntactic sugar and automatic promisification of methods so you rarely have to use new Promise yourself.

Also, consider reading this and that to learn more about promise error handling.

这篇关于如何处理错误与承诺?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆