2017-01-07 162 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指出:) –

相關問題