Promettez-vous comment mettre en œuvre dans cette situation?

J'ai un problème avec la synchronisation en utilisant fs.readfile, ils ne sont pas initialiser à la première fois, si j'essaye de réessayer, alors j'ai des résultats. Je sais que je peux faire une promesse et je trouve quelque chose d'utile avec Q de Kriskowal . Je l'ai essayé mais sans succès. Je ne comprenais pas très bien comment l'appliquer. Si quelqu'un peut aider à cela, je serai éternellement reconnaissant.

code:

"use strict" var Q = require('q'); var fs = require('fs'); var arrayZipBand = []; var jsonZipCode = []; var arrayParsedZipcodeBr = []; exports.parse = function(opts) { if (opts.zipBand.constructor != Array) { opts.zipBand = [opts.zipBand]; } if (opts.location.constructor != Array) { opts.location = [opts.location]; } if (opts.config === 0) { opts.zipBand.forEach(function(file) { fs.readFile(file, 'utf8', function(err, logData) { if (err) throw err; let text = logData.toString(); decodeURIComponent(text); let lines = text.split('\n'); lines.forEach(function(line) { let parts = line.split('@'); if (parts[1] != undefined) { let obJson = { LOC_NU: parts[0], LOC_CEP_INI: parts[1], LOC_CEP_FIM: parts[2] } arrayZipBand.push(obJson); } }); }); }); opts.location.forEach(function(file) { fs.readFile(file, 'utf8', function(err, logData) { if (err) throw err; let text = logData.toString(); decodeURIComponent(text); let lines = text.split('\n'); lines.forEach(function(line) { let parts = line.split('@'); if (parts[1] != undefined) { for (let i = 0; i < arrayZipBand.length; i++) { if (parts[0] == arrayZipBand[i].LOC_NU) { jsonZipCode.push(arrayZipBand[i]); } } if (jsonZipCode === undefined) { throw "Was not possible to find Zipcode for the id " + parts[0]; } for (let i = 0; i < jsonZipCode.length; i++) { let obJson = { LOC_NU: parts[0], UFE_SG: parts[1], LOC_NO: parts[2], MUN_NU: parts[8], LOC_CEP_INI: jsonZipCode[i].LOC_CEP_INI, LOC_CEP_FIM: jsonZipCode[i].LOC_CEP_FIM } arrayParsedZipcodeBr.push(obJson); } jsonZipCode = []; } }); }); }); }; return arrayParsedZipcodeBr; } 

Uhm, il semble que vous essayez de lire les fichiers dans le cycle de boucle puis, mais d'une manière asynchrone. La première question, c'est pourquoi les fichiers asynchiques sont-ils lus? Vous pouvez toujours les lire de manière synchronisée:

 var data=fs.readFileSync(fname, encoding); 

Soit dit en passant, si vous souhaitez les lire asynchrone et garder la boucle … vous avez besoin de quelque chose comme une promesse ou une attente programmée ou un mécanisme de synchronisation plus complexe.

Vous pouvez le simplifier, sans utiliser d'autres paquets / modules de cette façon:

 /** * Promise.All * @param items Array of objects * @param block Function block(item,index,resolve,reject) * @param done Function Success block * @param fail Function Failure block * @example promiseAll(["a","b","c"], function(item,index,resolve,reject) { MyApp.call(item,function(result) { resolve(result); }, function( error ) { reject(error); }): }, function(result) { // aggregated results },function(error) { // error }) * @author Loreto Parisi (loretoparisi at gmail dot com) */ promiseAll: function(items, block, done, fail) { var self = this; var promises = [], index = 0; items.forEach(function(item) { promises.push(function(item, i) { return new Promise(function(resolve, reject) { if (block) { block.apply(this, [item, index, resolve, reject]); } }); }(item, ++index)) }); Promise.all(promises).then(function AcceptHandler(results) { if (done) done(results); }, function ErrorHandler(error) { if (fail) fail(error); }); }, //promiseAll 

Afin que vous puissiez l'appeler comme

 promiseAll(arrayOfItems, function(item, index, resolve, reject) { // do something on item if (someSuccessCondOnThisItem) { resolve(item) } else { reject(new Error("operation failed")) } }, function(results) { // aggregated results console.log("All done %d", results.length); }, function(error) { // error console.log(error.toString()); }); 

Gardez à l'esprit qu'il s'agit d'une approche très simplifiée, mais dans la plupart des cas, cela fonctionne lorsque vous faites du vélo à travers des tableaux.

Voici un exemple de travail simple dans le terrain de jeu:

 var console = { log : function(s) { document.getElementById("console").innerHTML+=s+"<br/>"} } var promiseAll= function(items, block, done, fail) { var self = this; var promises = [], index = 0; items.forEach(function(item) { promises.push(function(item, i) { return new Promise(function(resolve, reject) { if (block) { block.apply(this, [item, index, resolve, reject]); } }); }(item, ++index)) }); Promise.all(promises).then(function AcceptHandler(results) { if (done) done(results); }, function ErrorHandler(error) { if (fail) fail(error); }); }; //promiseAll arr=[1,2,3] promiseAll(arr ,function(item,index,resolve,reject) { console.log("Resolving item[" + index+"]") var okCond=true if(okCond) {resolve(item)} else { reject(new Error("item[" + index+"]")) } } ,function(results) { // aggregated results console.log("All done of "+results.length); } ,function(error) { // error console.log(error); }); 
 <div id="console"/>