Node.js async:如何将多个迭代器与 map 结合起来?
Node.js async: How to combine multiple iterators with map?
我是 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 但我在异步编程方面没有太多经验,所以有点头疼。
好吧,经过一番尝试和阅读文档后,我的代码现在是这样的:
function upload(release, callback) {
async.waterfall([
async.apply(async.map, release.files, getInfo),
pushInfos,
function(next) {
// do some work...
}
], callback);
}
欢迎,我的朋友,回调地狱!
如果您正在编写异步代码,我建议您看一下 Promises 而不是回调。
但是如果你想用回调和异步编写你的代码,你能做的最好的事情是这样的:
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...
});
}
编辑
这个答案其实和问题代码的表现不一样,我误解了问题,写错了。 James 的回答与问题代码的行为相同。
我是 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 但我在异步编程方面没有太多经验,所以有点头疼。
好吧,经过一番尝试和阅读文档后,我的代码现在是这样的:
function upload(release, callback) {
async.waterfall([
async.apply(async.map, release.files, getInfo),
pushInfos,
function(next) {
// do some work...
}
], callback);
}
欢迎,我的朋友,回调地狱!
如果您正在编写异步代码,我建议您看一下 Promises 而不是回调。
但是如果你想用回调和异步编写你的代码,你能做的最好的事情是这样的:
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...
});
}
编辑
这个答案其实和问题代码的表现不一样,我误解了问题,写错了。 James 的回答与问题代码的行为相同。