我有一个问题,我似乎不能四处走动。
成像如下
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)
}通常,我通过将第一个代码块封装到一个函数中来处理这种情况,该函数返回一个回调函数,然后运行第三个函数,但是如果实际发生了两个单独的操作,我如何才能这样做呢?
为了明确起见,我想避免分别保存用户和配置文件,原因有很多。
我想知道是否有任何标准的方法来处理这种情况,因为可能有或可能没有用户或配置文件,所以使用回调似乎不起作用吗?
发布于 2017-01-07 13:35:42
您可以使用异步模块来实现这一点。使用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()函数回调的第二个参数。
https://stackoverflow.com/questions/41521847
复制相似问题