[英]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) {
});
它是這樣的:
我了解為什么它按此順序工作 ,在某些情況下這可能是完全正確的。 但是在我的特定情況下,僅在上一個迭代完成后才需要開始新的迭代:
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) {
});
實時示例 (將墊片用於readData
和writeData
):
// 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.