我是Node.js的新手。我正在尝试使用async
进行一些异步工作,其中我有多个嵌套回调,如果可能的话,我想将一些函数合并为一个。这是代码:
function getInfo(info, callback) { /*...*/ }
function pushInfos(infos, callback) { /*...*/ }
function upload(release, callback) {
async.map(release.files, getInfo, function(err, infos) {
if (err)
return callback(err);
pushInfos(infos, function(error) {
if (error)
return callback(error);
// do some more work...
});
});
}
我想知道是否有办法合并getInfo
和pushInfo
函数,这样我只需要一个嵌套回调。像这样:
function upload(release, callback) {
async.xxxx(release.files, [ // What goes here?
getInfo,
pushInfos
],
function(error) {
// do some more work...
}
}
这样的API是否存在或我是否必须处理额外的代码?我试着查看documentation on GitHub,但我在异步编程方面没有多少经验,所以这有点过头了。
答案 0 :(得分:1)
好吧,经过一些游戏并阅读文档后,我的代码现在就是这样:
function upload(release, callback) {
async.waterfall([
async.apply(async.map, release.files, getInfo),
pushInfos,
function(next) {
// do some work...
}
], callback);
}
答案 1 :(得分:1)
欢迎,我的朋友,回调地狱!
如果您正在编写异步代码,我建议您先看看Promise而不是回调。
但是如果你想用回调和异步编写你的代码,你可以做的最好是:
function getInfo(info, callback) { /*...*/ }
function pushInfos(infos, callback) { /*...*/ }
function upload(release, callback) {
async.map(release.files, function(file, callback) {
async.waterfall([
async.apply(getInfo, file),
pushInfos
], callback);
}, function(err, infos) {
if (err)
return callback(err);
// do some more work...
});
}
修改强>
这个答案实际上与问题代码不同,我误解了这个问题并写错了。詹姆斯'答案的行为与问题代码相同。