2 votes

Forcer une variable javascript à être passée en tant que "valeur".

J'ai un problème avec un "problème" classique de javascript !

Je veux créer un tableau de fonctions qui seront chacune réglées pour s'exécuter après différents laps de temps (à une seconde d'intervalle).

Cependant, le code suivant crée des fonctions qui ont toutes un délai d'attente fixé à la dernière valeur du délai d'attente.

Toute aide pour résoudre ce problème serait la bienvenue ! Merci !

    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)
    })

La raison pour laquelle chaque fonction a un callback est que je prévois de les exécuter toutes en utilisant :

    async.parallel(myfunctions,
      function(err, results) {
        if(err) {
          console.log(err.message)
        }
        else{
          console.log(results)
        }
      })

3voto

T.J. Crowder Points 285826

Vous venez de mal appliquer le modèle habituel ; vous le faites trop loin, en attendant d'appeler le IIFE interne jusqu'à ce que votre fonction soit appelée, et à ce moment-là timeout est déjà mis à jour.

Mais il n'est pas nécessaire d'utiliser le IIFE, vous pouvez utiliser la fermeture de la callback pour 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)
});

Exemple en direct :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X