2013-03-29 20 views
0

我想將異步函數getProjects的響應傳遞給Seq([644511,340755])如何進入Seq響應函數?

所以,我想

... 
var ids = pivotal.getProjects(function (err, data) { 
    var ids = data.project.map(function(x) { return parseInt(x.id); }); 
    console.log("IDS_i: ".red + ids); 
}); 
console.log("IDS_e: ".red + ids); 

Seq(ids) 
    .parEach(function(project_id) { 
.... 

日誌:

IDS_e: undefined 
GET /stories 200 34ms 
GET /favicon.ico 404 2ms 
IDS_i: 644511,340755 

我想,也許我應該把這個變成Seq

Seq() 
    .seq(function() { 
     pivotal.getProjects(function (err, data) { 
     data.project.map(function(x) { return parseInt(x.id); }); 
     }); 
    } 

但如何返回IDS作爲數組案件?

回答

1

getProjects也是異步的。基本規則:您不能從異步函數中返回任何值。您必須在回調函數中執行所有處理。在你的數組被聚合之前,執行將繼續。所以你seq的做法是你所需要的:

Seq() 
    .seq(function() { 
     pivotal.getProjects(this); 
    }) 
    .flatten() 
    .seqEach(function(project) { 
     var projectId = project.id; 
     myService.someOtherAsyncAction(projectId, this); 
    }); 

node-seq將通過傳遞this的回調函數,以您的異步函數的回調的結果傳遞給下一個seq一步照顧。這就是流程和結果如何傳遞到下一步。 flatten將確保每個project作爲堆棧中的單個元素提供,因此您可以在下一步中執行seqEach

+0

好吧,我明白了,但有一個問題與''projects.project.map(函數(x){返回parseInt(x.id);});''如何將它傳遞到新的步驟(''.parEach '')作爲數組。我必須把這個新的功能? – tomekfranek

+0

您可以嘗試'seqEach'而不是'seq'作爲第二步。你可能不得不「平整」數組,但是每個'project'都被認爲是堆棧中的一個元素。我會用一些僞代碼更新答案。 – NilsH

+0

謝謝,有一件事看起來像flatten()不是我所需要的。我不能在flatten()上使用seqEach,因爲''this''是''[object Object]''我不得不把''this''設置爲''this.project'',然後我會得到'''對象對象],[對象對象]'' – tomekfranek