2015-05-28 106 views
1

我想執行兩個功能異步系列與node.JS. 但我不明白要這樣做。執行功能異步系列

現在,我有:

功能1:

function search(client_id, callback) { 
    clientRedis.keys('director:*', function (err, results) { 
     results.forEach(function (key) { 
      clientRedis.hgetall(key, function (err, obj) { 
       //SAVE RESULT 
       console.log('save'); 
      }); 
     }); 
    }); 
    callback(null, results); 
} 

功能2:

function range(client_id, callback) { 
    //Sort my array 
    callback(null, results); 
} 

而且我在這裏把這個功能:

async.series([ 
    search(client_id), 
    range(client_id); 
], function (err, result) { 
    console.log(err); 
    console.log(result); 
}); 

我的問題:第二個功能是執行bef第一個是因爲第一個需要更多的時間。我需要的結果第1功能與功能2.

+0

在附註中,您是否知道在生產中不推薦使用'redis.keys',因爲它會掃描*所有*鍵? – Zlatko

+0

那麼,我可以使用什麼? – Matthieu

+0

你不會喜歡答案:這取決於。你在那裏抓什麼?一些對象ID?數據?遠程數據,集合,序列化對象? – Zlatko

回答

0

如果你不打算使用第二個直接(只能通過Redis的)中的第一個功能的結果,你可以使用類似這樣的東西:

async.series([ 
    search.bind(null, client_id), 
    range.bind(null, client_id) 
], function (err, results) { 
    console.log(err); 
    console.log(results[0]); // for search results 
    console.log(results[1]); // for range results 
}); 
+0

請問,什麼是綁定? – Matthieu

+0

閱讀https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Function/bind – zag2art

0

search(client_id)range(client_id)將立即執行的範圍我的陣列,已經callback參數分配給undefined然後async.series會試圖執行這些功能的結果作爲一個系列,而且可能因爲這些不是功能,但是undefined。或者說,如果功能沒有嘗試去做undefined(null, results)

請記住,如果f是函數,則f(...)會執行它。您需要將函數本身傳遞給async.series,而不是執行結果。

async.series希望你傳遞一個數組或任務對象,每個任務是function(callback) { ... }

因此,下面的應該有所幫助:

async.series([ 
    function(callback) { search(client_id, callback); }, 
    function(callback) { range(client_id, callback); } 
]...) 

如果你在Haskell寫作,支持鑽營,你的代碼將是正確的;但在JavaScript中,​​與f(x, y)不同。

你也不會在Redis成功函數裏面調用callback,這也會弄亂你的計時。

0

您應該使用async.waterfall而不是async.series來獲得第二個函數的第一個函數結果。

以串聯方式運行函數的任務數組,每個函數都將結果傳遞給數組中的下一個。但是,如果任何任務將錯誤傳遞給自己的回調,則不執行下一個函數,並立即調用主回調並返回錯誤。

而且,你的代碼有很大的錯誤。如果我理解你的代碼,你想在修改完所有結果後轉到第二個函數,並返回第二個函數的權利?在這種情況下,使用async.each代替result.forEach和調用回調每個異步後:

function search(client_id, callback) { 
    clientRedis.keys('director:*', function (err, results) { 
     var savedElems = []; 
     async.each(results, function (key, done) { 
      clientRedis.hgetall(key, function (err, obj) { 
       if (err) { 
        return done(err); 
       } 
       savedElems.push(obj); 
       done(); 
      }); 
     }, function (err) { 
      if (err) { 
       return callback(err); 
      } 
      callback(null, savedElems); 
     }); 
    }); 
}