2017-07-25 5 views
0

J'ai cette boucle pour télécharger des fichiers et ça marche très bien.NodeJs Utiliser async avec pour le téléchargement de la boucle

Mais les fichiers sont téléchargés comme "2,3,4,1,5" et non "1,2,3,4,5".

Je sais comment faire .each async et cascade async mais je ne sais pas comment faire pour cette boucle.

Config.TotalFiles = 5; 

for(i = 1; i <= Config.TotalFiles; i++) { 
    $this.CreateJSONFile(i, function() { 
    cls(); 
    }); 
} 

Et quand les téléchargements sont faits que je veux appeler mon rappel, je l'ai essayé if(id == Config.TotalFiles) mais il est ne fonctionne pas parce que l'identifiant est pas bon. Comment faire un processus "async" avec cette boucle?

Merci

+0

'async.times'? – Bergi

+0

J'ai toujours "1,5,3,4,2" ... – EyWN

+0

Cela dépend de la rapidité avec laquelle chaque appel de 'CreatJSONFile' fait son travail. Ils sont * démarrés * dans l'ordre attendu toujours. Si vous voulez vous assurer qu'ils se terminent également dans l'ordre attendu, votre seul choix est de le faire de manière séquentielle au lieu de le faire en parallèle (en utilisant les méthodes '... Series'). – Bergi

Répondre

1

Vous pouvez utiliser async.whilst pour cela:

Config.TotalFiles = 5; 
var count = 1; 

//pass your maincallback that you want to call after downloading of all files is complete. 

var callMe = function(mainCallback){ 
    async.whilst(
     function() { return count <= Config.TotalFiles; }, 
     function(callback){ 
      $this.CreateJSONFile(count, function() { 
       cls(); 
       count++; 
       callback(); 
      }); 
     }, function(){ 
      //This function is the final callback 
      mainCallback(); 
     }) 
} 
+0

Désolé mais je veux juste un nombre (81) ^^ – EyWN

+0

Vous pouvez vérifier ma réponse éditée. Cela fera le travail. – Kamesh

+0

C'est du travail, merci :) – EyWN

0

Oui, vous avez besoin de mettre en œuvre async pour boucle. L'idée principale est d'appeler callback (comme continuer), lorsque l'étape en cours est terminée. Vous pouvez utiliser une bibliothèque utile comme mentionné ci-dessus (async.js). Mais vous devez également comprendre que cela ne se fera pas en parallèle (donc le temps pour terminer les téléchargements sera augmenté).

Ce sont quelques bons exemples pour vous aider: https://github.com/caolan/async/blob/v1.5.2/README.md#whilst

+0

J'ai toujours "1,5,3,4,2" ... – EyWN

+0

Pouvez-vous vérifier ma réponse s'il vous plaît? J'ai ajouté plus de code – EyWN

0

Vérifiez mon écran s'il vous plaît pour comprendre mon cas.

http://imgur.com/a/lxQyy

Ou cette Pastebin https://pastebin.com/jtANeSxq

   cls(); 
       for(i = 1; i <= Config.TotalFolders; i++) { 
        $this.CreateJSONFile(i, function() { 
         setTimeout(function() { 
          cls(); 
         }, 200); 
        }); 
       } 

    CreateJSONFile(id, callback) { 
    console.log(chalk.hex("#607D8B")(`Creating JSON Files... [${id}/${Config.TotalFolders}]`)); 
    var requestOptions = { 
     encoding: "binary", 
     method: "GET", 
     uri: `${Config.Url.Source}${Config.Url.Audio}` + `${id}/skeud.json` 
    }; 
    request(requestOptions, function (error, response, body) { 
     if (!error && response.statusCode === 200) { 
      if(!fs.existsSync(Config.DownloadsPath + `${id}/skeud.json`)) { 
       fs.writeFile(Config.DownloadsPath + `${id}/skeud.json`, body, function(err) { 
        if(err) { 
         return console.log(err); 
        } 
        console.log(chalk.hex("#FFEB3B")(`JSON File ${chalk.inverse(id)} ${chalk.hex("#FFEB3B")("created")}`)); 
       }); 
      } else { 
       console.log(chalk.hex("#FFEB3B")(`JSON File ${chalk.inverse(id)} ${chalk.hex("#FFEB3B")("skipped")}`)); 
      } 
     } 
    }); 
    /*if(created == Config.TotalFolders) { 
     callback(); 
    }*/ 
} 

Merci