Ответ 1
uhm, похоже, вы пытаетесь читать файлы в цикле цикла тогда, но в асинхронном режиме. Первый вопрос, почему асинхронное чтение этих файлов? Вы всегда можете прочитать их синхронно:
var data=fs.readFileSync(fname, encoding);
Кстати, если вы хотите прочитать их async и сохранить цикл 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"/>