我遇到了一个我似乎无法解决的问题。
对以下内容进行成像
if (users) {
for (var i = 0; i < users.length; i++) {
apiData.users = getUserDetails(users[i]);
}
}
和
if(profiles) {
for (var i = 0; i < profiles.length; i++) {
apiData.profiles = getProfileDetails(users[i]);
}
}
现在,只有这两个代码块都已完成(即API调用已返回所需的结果),我是否愿意做这样的事情
for (var i = 0; i < users.length; i++) {
saveUserProfile(apiData)
}
通常我通过将第一个代码块包装在一个返回回调的函数中然后运行第三个函数来处理这种情况,但是如果有效地发生了两个单独的操作,我怎么能这样做呢?
要明确的是,我想避免单独保存用户和个人资料,原因有多种。
我想知道是否有任何标准方式来处理这样的情况,因为可能有也可能没有用户或配置文件,所以使用回调似乎不起作用?
答案 0 :(得分:0)
您可以使用async模块来实现此目的。
使用async.parallel()
函数,因为您的第一个和第二个片段不相互依赖,并且可以异步运行,但您希望在第一个和第二个片段完成执行时使第三个片段运行。
假设users
,profiles
和apiData
已经宣布,您的代码将会是
function func1(callback){
if (users) {
for (var i = 0; i < users.length; i++) {
apiData.users = getUserDetails(users[i]);
}
}
//invoke callback
}
function func2(callback){
if(profiles) {
for (var i = 0; i < profiles.length; i++) {
apiData.profiles = getProfileDetails(users[i]);
}
}
//invoke callback
}
var asyncfunc = [];
asyncfunc.push(func1);
asyncfunc.push(func2);
async.parallel(asyncfunc,function(err,result){
//result is an array which receives the second argument of each function's callback.
for (var i = 0; i < users.length; i++) {
saveUserProfile(apiData)
}
})
的修改
PS:你也可以在这里使用async.series()。在这种情况下,两者都是等价的,因为async.parallel()
在这里处理的函数不使用定时器既不执行I / O任务。
数组中每个函数中的callback
有两个参数。第一个参数表示错误,如果没有错误,则为null
,第二个表示函数的结果,该函数将传递给async.parallel()
函数回调的第二个参数。