簡體   English   中英

如何組織async.waterfall調用循環

[英]How to organize a loop of async.waterfall calls

如何組織async.waterfall調用循環, 以便每次迭代僅在上一個迭代完全完成之后開始

到目前為止,我有以下代碼:

var hasMoreData = true;
async.whilst(function () {
  // * has more data?
  return hasMoreData;
},
function processData(callback1) {
  async.waterfall([
    function readDataFromSource(callback2) {
      // * read data
      readData(function readFinished(data, hasMore) {
        // * got data 
        hasMoreData = hasMore;
        callback2(null, data);
      });
    }, 
    function writeDataToDest(data, callback2) {
      // * write data
      writeData(data, function writeFinished() {
        callback2();
      });
    },
  ], function (err) {
    callback1(err);
  });
},
function finished(err) {

});

它是這樣的:

  • 有更多數據? (1)
  • 讀取數據(1)
  • 有更多數據? (2)
  • 讀取數據(2)
  • 得到了數據(1)
  • 寫數據(1)
  • ...

我了解為什么它按此順序工作 ,在某些情況下這可能是完全正確的。 但是在我的特定情況下,僅在上一個迭代完成后才需要開始新的迭代:

  • 有更多數據? (1)
  • 讀取數據(1)
  • 得到了數據(1)
  • 寫數據(1)
  • 有更多數據? (2)
  • 讀取數據(2)
  • ...

PS:例如,我無法將所有數據讀入數組,然后使用async.each處理該數組。 我也無法預測外部源有多少數據。

我不使用async ,而是僅查看代碼,描述和API文檔,看來這確實可以滿足您的要求,根本不使用waterfall

var hasMoreData = true;
async.whilst(function () {
  // * has more data?
  return hasMoreData;
},
function processData(callback1) {
  // * read data
  // blocking i/o operation
  readData(function readFinished(data, hasMore) {
    // * got data
    hasMoreData = hasMore;
    // * write data
    // blocking i/o operation
    writeData(data, function writeFinished() {
      callback1();
    });
  });
},
function finished(err) {

});

實時示例 (將墊片用於readDatawriteData ):

 // Shims var datacount = 0; function readData(callback) { // since you said "blocking", busy-wait for a quarter second var done = Date.now() + 250; while (done > Date.now()) { } // but calls like this are almost always async, so we'll complete async ++datacount; setTimeout(function() { callback(datacount, datacount < 3); }, 0); } function writeData(data, callback) { // since you said "blocking", busy-wait for a quarter second var done = Date.now() + 250; while (done > Date.now()) { } // but calls like this are almost always async, so we'll complete async setTimeout(function() { callback(); }, 0); } // The code var hasMoreData = true; async.whilst(function() { // * has more data? snippet.log("has more data?"); return hasMoreData; }, function processData(callback1) { // * read data snippet.log("read data"); // blocking i/o operation readData(function readFinished(data, hasMore) { // * got data snippet.log("got data: " + data + " (more? " + hasMore + ")"); hasMoreData = hasMore; // * write data snippet.log("write data"); // blocking i/o operation writeData(data, function writeFinished() { callback1(); }); }); }, function finished(err) { snippet.log("finished"); }); 
 <!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 --> <script src="//tjcrowder.github.io/simple-snippets-console/snippet.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/async/1.5.0/async.min.js"></script> 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM