强制javascript变量作为“值”传递

时间:2016-08-28 16:59:34

标签: javascript node.js

我遇到经典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)
        }
      })

1 个答案:

答案 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();
});