2016-05-24 4 views
2

サービスでasync.series([])を使用し、その結果をControllerに返したいとします。しかし、async.seriesのオプションのコールバック関数は、タスクが終了してからコントローラに戻るまで待機しないようです。同様の場合 Sails.js async.series([])のforループを使用する方法は?

/* In Services */ 
 
getFunction: function(userInput, callback) { 
 
    var results = {}; 
 
    
 
    async.series([ 
 
    //1: This function get a list JSON dataset of id and other attributes 
 
    function(callback) { 
 
     //Call a function to call API by using the userInput, return function(error, JSONdataset1) 
 
     //If error, return callback(error) 
 
     //Else results = JSON.parse(dataset1); 
 
     callback(null, JSON.stringify(results)); 
 
    }, 
 
    //2: This function get a JSON object by input the id result from above function 
 
    //I am not sure I should use for loop here as well, can someone advise me please! 
 
    function(callback) { 
 
     for(var result in results) { 
 
     //Call another function to call API by using the id in the returned results, return function(error, JSONdataset2) 
 
     //If error, return callback(error) 
 
     //Else 
 
     var aName = JSON.parse(JSONdataset2); 
 
     results[result].name = JSON.parse(JSON.stringify(aName.attribute)); 
 
     } 
 
     callback(null, JSON.stringify(results)); 
 
    } 
 
    ], 
 
    //res = [JSON.stringify(results), JSON.stringify(results)] and result should return to Controller 
 
    //The problem is the callback doesn't wait above functions finish before return. 
 
    function(error, res) { 
 
    if(error) { return callback(error, null); } 
 
    else { return callback(null, res); } 
 
    }); 
 
    
 
}

+0

このforループ内で行っている呼び出しは**ループ反復**よりも実際に遅いです。したがって、ループが完了すると、コールバックが呼び出され、コントローラに戻ります。ループは、その関数呼び出しが終了するまで待機しません。 –

答えて

0

以前に投稿したコードの代わりに、私はasync.waterfallを使用しました。

0

、Iは例えば、async.each()関数を使用します

async.each(results, function(result){ 
    var aName = JSON.parse(JSONdataset2); 
    results[result].name = JSON.parse(JSON.stringify(aName.attribute)); 
    callback(); 
}, function(err){ 
    if(err) callback(err,null); 
    else callback(null, JSON.stringify(results)); 
}) 

これにより、シリーズ関数に属するコールバックが呼び出される前に、それぞれの結果が繰り返し処理されます。

関連する問題