我遇到经典javascript“问题”的问题!
我想创建一个函数数组,每个函数都设置为在不同的时间长度(每隔一秒)之后运行。
但是,以下代码创建的函数都将超时设置为最后一个超时值。
任何帮助解决这个问题都会很精彩!谢谢!
var timeout = 0;
var myfunctions = []
urls.forEach(function(url){
var newFunction = function(callback){
(function (timeout){
setTimeout(function(){
getTransactions(url, function(err, data){
callback(err, data)
})
},timeout)
})(timeout)
}
timeout = timeout + 1000
myfunctions.push(newFunction)
})
每个函数都有回调的原因是我计划使用以下命令运行它们:
async.parallel(myfunctions,
function(err, results) {
if(err) {
console.log(err.message)
}
else{
console.log(results)
}
})
答案 0 :(得分:3)
你只是误用了通常的模式;你做得太过分了,等到调用内部IIFE直到你的函数被调用,此时timeout
已经更新。
但根本不需要IIFE,你可以使用forEach
的回调结束:
var timeout = 0;
var myfunctions = []
urls.forEach(function(url) {
var thisTimeout = timeout;
var newFunction = function(callback) {
setTimeout(function() {
getTransactions(url, function(err, data) {
callback(err, data)
})
}, thisTimeout)
};
timeout = timeout + 1000
myfunctions.push(newFunction)
});
直播示例:
var timeout = 0;
var myfunctions = [];
var urls = ["first", "second", "third"];
urls.forEach(function(url) {
var thisTimeout = timeout;
var newFunction = function(callback) {
console.log("url = " + url + ", thisTimeout = " + thisTimeout);
/*
setTimeout(function() {
getTransactions(url, function(err, data) {
callback(err, data)
})
}, thisTimeout)
*/
};
timeout = timeout + 1000
myfunctions.push(newFunction)
});
myfunctions.forEach(function(f) {
f();
});