承诺如何在这种情况下实施?

我有一个同步使用fs.readfile的问题,他们不inenterizing第一次,如果我再次请求,然后我有结果。 我知道我可以使用承诺,我发现从Kriskowal Q有用。 我尝试过,但没有成功。 我不太清楚如何实现它。 如果有人可以帮助,我将永远感激。

码:

"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; } 

呃好像你正在尝试在循环中读取文件,然后以asynchronous的方式。 第一个问题,是为什么asynchronous阅读这些文件? 您可以随时以同步方式阅读它们:

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

顺便说一句,如果你想阅读asynchronous,并保持for …循环,你需要像Promise,定时等待或更复杂的同步机制。

你可以保持简单,不用任何其他的软件包/模块这样:

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

所以你可以这样称呼它

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

请记住,这是一个非常简单的方法,但在大多数情况下,它通过数组循环时工作。

这里是操场上的一个简单的例子:

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