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" />
https://www.npmjs.com/package/promise-denodeify –
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