如何组织 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(
- 获取数据 (1(
- 写入数据 (1(
- 。
我理解为什么它按这个顺序工作,在某些情况下这可能是完全正确的。但是在我的特定情况下,我只需要在前一个迭代完成后才开始新的迭代:
- 有更多数据 ?(1(
- 读取数据 (1(
- 获取数据 (1(
- 写入数据 (1(
- 有更多数据 ?(二(
- 读取数据 (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) {
});
实时示例(使用填充程序进行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>
相关文章:
- 等待循环调用的所有承诺完成
- 为循环调用JavaScript中的SQL
- 如何在每个元素上循环调用jquery.each的数组
- 而循环调用setTimeout不起作用
- jquery每个带有参数的循环调用函数
- 本机 Ajax 中的循环调用函数
- jQuery函数使用包含setTimeout的每个循环调用自身,立即发生,而不是在结束时发生
- 使用for循环调用setTimeout
- 在jquery get请求中从for循环调用var i
- 使用增量ID从循环调用Javascript
- 用javascript中的数组循环调用函数
- document.ready用angular.js以无限循环调用
- 如何在从循环调用的方法中动态分配参数
- 如何在HTML中从for循环调用jQuery函数
- Javascript函数在等待ajax响应时循环调用
- 使用for循环调用函数时浏览器崩溃
- Javascript for循环中的函数被另一个for循环调用
- Javascript循环调用函数
- 你能从PHP循环调用JavaScript函数吗?
- 而Number原型扩展中的循环调用函数一次,然后出现未定义的错误