2017-01-07 133 views
0

我遇到了一个我似乎无法解决的问题。nodejs在完成多个功能后执行某些操作

成像以下

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

您可以使用async模块来实现此目的。 使用async.parallel()函数,因为您的第一个和第二个片段不依赖于彼此,并且可以异步运行,但是您希望在第一个和第二个执行完成时执行第三个片段运行。

假设usersprofiles,并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()函数的回调函数的第二个参数。

+0

谢谢!我以前从未使用过异步,但似乎您需要始终使用async中的函数返回回调。 –

+0

对不起。我相应地编辑了答案。 thanxx指出:) –

相关问题