如何重复调用一个函数并等待下一次调用之前完成
How to repeatedly call a function and wait for completion before next call?
我使用node.js
我有一个有几个参数的函数,我需要在循环中调用。必须将循环迭代器作为参数调用该函数,并且在处理完成之前,循环不得再次调用该函数。
像这样(同步方法):(注意someFunc是一个异步函数)
var totCount = 1000;
for (var x = 0 ; x < totCount ; x++) {
someFunc(x, parm2, parm3, parm4);
}
我知道在node中,someFunc可以以任何顺序执行,但对于这种情况,它绝对必须以x = 0然后1然后2等方式执行。
似乎async库调用"async。而将做到这一点,但我有麻烦的例子翻译成我的现实生活中的代码。
下面是"async. while ": 的示例var count = 0;
async.whilst(
function () { return count < 5; },
function (callback) {
count++;
setTimeout(callback, 1000);
},
function (err) {
// 5 seconds have passed
}
);
注意,由于我可能不得不多次调用函数someFunc,普通的回调方法将不起作用。
我如何把它翻译成我的代码?(我假设是"异步"。"而"是正确的方法。如果没有,请说明正确的方法)
下面的例子假设someFunc是异步的,并以回调作为最后一个参数。它是否存在取决于它是如何实现的。如果它是另一个库的一部分,它可能会。
var count = 0;
var totCount = 1000;
async.whilst(
function () { return count < totCount; },
function (callback) {
someFunc(count, parm2, parm3, parm4, callback);
count++;
},
function (err) {
// someFunc has been called totCount times, or an error has occured
}
);
如果someFunc不是异步的,但你想异步运行循环以避免阻塞,你可以简单地在函数调用后调用回调。
//...
function (callback) {
someFunc(x, parm2, parm3, parm4);
count++;
callback();
},
// ...
不使用async/promises(未测试):
var count = 0;
var totCount = 1000;
function loop () {
// Async lets you provide you own check-method
if(count >= totCount) {
// Async lets you provide your own done-method
return done();
}
// Async does setImmediate/process.nextTick somewhere around here
myFunc(count, param, param, function() {
// Async checks for errors here
count++;
loop();
});
}
function done () {
// Async provides any errors here
console.log("done");
}
我注释了async做了一些额外的东西,这些东西可能是很好的(大多数情况下,查看源代码以了解细节,它非常容易阅读)。例如,如果someFunc实际上不是异步的,而只是调用一个回调,这将像使用For(…)一样终止事件循环。
听起来你想使用承诺,假设你可以设置someFunc,使它返回一个承诺。你可以这样做:
var promise=new Promise().fulfill();
var totCount = 1000;
for (var x = 0 ; x < totCount ; x++) {
promise=promise.then(function(){return someFunc(x, parm2, parm3, parm4);});
}
promise.then(function(){console.log("done");});
相关文章:
- 如何在chrome扩展中存储数据/结果,以及如何使用setTimeout使其只被调用一次
- Rails操作只调用一次,但我在ajax中每秒钟都调用一次
- Angular 1.5变量在调用一次之前不起作用
- 如何每 10 秒调用一次 JS 函数,然后以角度激活一个函数
- Javascript 计时器只调用一次 Code 隐藏方法
- 一段时间后调用函数,但只调用一次
- 每隔1秒调用一次jQueryajax是否安全
- 什么时候函数只能调用一次
- 如何在重复满足条件时调用一次辅助函数
- JS:.apply(null,arguments)——为什么我的函数被调用一次,而console.log被调用多次
- Angular指令删除只调用一次的DOM元素
- 对于新建的元素,onchange函数只调用一次
- ASP.NET:每5分钟从代码后面调用一次弹出窗口
- 每10秒调用一次页面加载事件
- 调用一次jQuery函数
- 我想在窗口加载后只调用一次JavaScript setInterval函数
- 如何只调用一次事件处理程序,而不是每次单击项目时调用事件处理程序
- 回调函数不会在使用 $timeout 的服务中只调用一次
- Angular 1.5.0 - 为什么工厂只调用一次
- 仅调用一次 onkeyup 函数