首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在多个函数完成后,nodejs做一些事情

在多个函数完成后,nodejs做一些事情
EN

Stack Overflow用户
提问于 2017-01-07 13:16:23
回答 1查看 767关注 0票数 0

我有一个问题,我似乎不能四处走动。

成像如下

代码语言:javascript
复制
if (users) {
 for (var i = 0; i < users.length; i++) {
  apiData.users = getUserDetails(users[i]);
 }
}

代码语言:javascript
复制
if(profiles) {
 for (var i = 0; i < profiles.length; i++) {
  apiData.profiles = getProfileDetails(users[i]);
 }
}

现在,只有在这两个代码块都完成后(即API调用返回了所需的结果),我才愿意这样做

代码语言:javascript
复制
for (var i = 0; i < users.length; i++) {
 saveUserProfile(apiData)
}

通常,我通过将第一个代码块封装到一个函数中来处理这种情况,该函数返回一个回调函数,然后运行第三个函数,但是如果实际发生了两个单独的操作,我如何才能这样做呢?

为了明确起见,我想避免分别保存用户和配置文件,原因有很多。

我想知道是否有任何标准的方法来处理这种情况,因为可能有或可能没有用户或配置文件,所以使用回调似乎不起作用吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-07 13:35:42

您可以使用异步模块来实现这一点。使用async.parallel()函数,因为您的第一和第二段不相互依赖,可以异步运行,但希望在执行第一和第二段时运行第三段。

假设已经声明了usersprofilesapiData,那么您的代码将类似于

代码语言:javascript
复制
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()函数回调的第二个参数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41521847

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档