2016-04-07 8 views
1

Ich habe ein Problem mit der Synchronisierung mit fs.readfile, sie sind nicht initialisieren beim ersten Mal, wenn ich erneut versuchen, dann habe ich Ergebnisse. Ich weiß, dass ich Versprechung verwenden kann, und ich finde etwas nützlich mit Q from Kriskowal. Ich habe es versucht, aber ohne Erfolg. Ich habe nicht sehr gut verstanden, wie man es implementiert. Wenn jemand damit helfen kann, werde ich ewig dankbar sein.Versprechen, wie in dieser Situation zu implementieren?

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; 

} 
+1

https://www.npmjs.com/package/promise-denodeify –

+1

Na, wie haben Sie versucht, Versprechen zu benutzen? Bitte [bearbeiten] Sie Ihre Frage, um uns Ihren Versuch zu zeigen. Hast du die Q-Dokumente gelesen? Hast du das Beispiel gesehen, 'fs'-Methoden mit' Q'-Hilfsfunktionen aufzurufen, damit du Versprechungen von ihnen bekommst? – Bergi

Antwort

2

uhm es scheint, dass Sie versuchen, Dateien in der Schleife Zyklus lesen dann, aber in einem Asynchron-Weg. Erste Frage, warum async diese Dateien liest? Sie können sie immer synchron Art und Weise lesen:

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

By the way, wenn Sie es wünschen Sie sie async und halten das für lesen ... Schleife so etwas wie ein Versprechen müssen, oder einer zeitlich warten oder eine komplexere Synchronisationsmechanismus.

Sie können es einfach halten, ohne auf diese Weise irgendwelche anderen Pakete/Module mit:

/** 
     * 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 

so kann man es nennen wie

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

Denken Sie daran, dass dies eine sehr vereinfachte ist Ansatz, aber in den meisten Fällen funktioniert es beim Durchlaufen von Arrays.

Hier ist ein einfaches Ausführungsbeispiel auf dem Spielplatz:

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"/>

Schließlich ist ein vollständiges asynchrones Beispiel, das zeigt, wie die Ausführung eines XMLHttpRequest zu verschieben, wenn sie durch eine Liste Radfahren. Die ExecutionBlock ruft reject und resolve nach dem SimpleRequest reagiert, was die Promise die Ausführung seiner warten vor dem Aufruf der then.

var console = { 
 
    log: function(s) { 
 
     document.getElementById("console").innerHTML += s + "<br/>" 
 
    } 
 
    } 
 
    // Simple XMLHttpRequest 
 
    // based on https://davidwalsh.name/xmlhttprequest 
 
SimpleRequest = { 
 
    call: function(what, response) { 
 
     var request; 
 
     if (window.XMLHttpRequest) { // Mozilla, Safari, ... 
 
     request = new XMLHttpRequest(); 
 
     } else if (window.ActiveXObject) { // IE 
 
     try { 
 
      request = new ActiveXObject('Msxml2.XMLHTTP'); 
 
     } catch (e) { 
 
      try { 
 
      request = new ActiveXObject('Microsoft.XMLHTTP'); 
 
      } catch (e) {} 
 
     } 
 
     } 
 
     // state changes 
 
     request.onreadystatechange = function() { 
 
     if (request.readyState === 4) { // done 
 
      if (request.status === 200) { // complete \t 
 
      response(request.responseText) 
 
      } else response(); 
 
     } 
 
     } 
 
     request.open('GET', what, true); 
 
     request.send(null); 
 
    } 
 
    } 
 
    //PromiseAll 
 
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 
 

 
// LP: deferred execution block 
 
var ExecutionBlock = function(item, index, resolve, reject) { 
 
    SimpleRequest.call('https://icanhazip.com/', function(result) { 
 
    if (result) { 
 
     console.log("Response[" + index + "] " + result); 
 
     resolve(result); 
 
    } else { 
 
     reject(new Error("call error")); 
 
    } 
 
    }) 
 
} 
 

 
arr = [1, 2, 3] 
 
promiseAll(arr, function(item, index, resolve, reject) { 
 
    console.log("Making request [" + index + "]") 
 
    ExecutionBlock(item, index, resolve, reject); 
 
}, function(results) { // aggregated results 
 
    console.log("All response received " + results.length); 
 
    console.log(JSON.stringify(results)); 
 
}, function(error) { // error 
 
    console.log(error); 
 
});
<div id="console" />

+1

danke für die Beispiele @loretoparisi Ich habe eine Menge gelernt – michelpm1

+0

@ michelpm1 Sie sind willkommen, vielleicht können Sie den Titel in etwas mehr indikativ wie versprechen alle in for Schleife usw. Das letzte Beispiel, zeigt, wie das Array als ein 'reduzieren XMLHttpRequest' zu Websites url ... – loretoparisi

Verwandte Themen