gpt4 book ai didi

node.js - 有没有办法克服 Node.js 中的回调 if(err) 样板?

转载 作者:太空宇宙 更新时间:2023-11-03 23:38:12 26 4
gpt4 key购买 nike

随着您的项目的发展,我们开始到处都有这种备受赞赏的防御性代码片段:

func(err, result){
if(err){

console.log('An error occurred!, @myModule :' + err);
return callback(err);
}

//then the rest..
}

快速谷歌搜索揭示了一些试图克服这个常见问题的库,例如https://www.npmjs.com/package/callback-wrappers .

但是在不影响我们现有的早期错误处理机制的情况下最大限度地减少样板代码的最佳方法是什么?

最佳答案

有几种方法可以帮助缓解这个问题,都使用外部模块。

首先,也是我的首选方法,是使用 async ,特别是async.series , async.parallelasync.waterfall 。如果任何异步调用中发生错误,这些方法中的每一个都会直接跳到最后一个函数,从而防止在整个回调中出现 if(err) 条件。

例如:

async.waterfall([
function(cb) {
someAsyncOperation(cb);
},
function(result, cb) {
doSomethingAsyncWithResult(result, cb);
}
], function(err, result) {
if(err) {
// Handle error - could have come from any of the above function blocks
} else {
// Do something with overall result
}
});

另一个选择是使用 Promise 库,例如 q 。它有一个函数Q.denodeify来帮助您将回调风格的代码包装成promise风格。对于 Promise,您可以使用 .then..catch.done:

var qSomeAsyncOperation = Q.denodeify(someAsyncOperation);
var qDoSomethingAsyncWithResult = Q.denodeify(doSomethingAsyncWithResult);

Q()
.then(qSomeAsyncOperation)
.then(qDoSomethingAsyncWithResult)
.done(function(result) {
// Do something with overall result
}, function(err) {
// Handle error - could have come from any of the above function blocks
});

我更喜欢使用async,因为它更容易理解正在发生的事情,并且它更接近node.js采用的真正的回调风格。

关于node.js - 有没有办法克服 Node.js 中的回调 if(err) 样板?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28697300/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com