Ich stieß auf einen Fehler in meinem Code, der mich lange Zeit verwirrte und nach einer Klärung suchte.Understanding .then() ES6
In diesem Code verursachte das auskommentierte innere Versprechen ein Problem. Das Promise.all() am Ende wurde fortgesetzt, sobald setTimeout aktiv war, nicht nach der Auflösung innerhalb des Timeouts.
Wrapping der asynchronen Code mit einer Verheißung behebt das Strömungsproblem, aber warum ist das?
Im Wesentlichen, warum können wir nicht einfach normalen Async-Code in einer. Then() - Kette, eine Rückkehr eine Promise.resolve() am Ende des asynchronen Rückrufs ausführen?
var asyncPromise = function() {
return new Promise(function(resolve, reject) {
setTimeout(function() {
console.log('Async Promise done');
resolve();
}, 1000);
});
};
var generateSignupPromises = function(qty) {
var promiseArray = [];
for (var i = 1; i <= qty; i++) {
promiseArray.push(
function() {
return asyncPromise()
.then(function() {
console.log('Before Timeout');
//Uncommenting this fixes the issue
//return new Promise(function(resolve, reject) {
setTimeout(function() {
console.log('After Timeout');
//resolve();
return Promise.resolve();
}, 500);
//})
});
}
);
}
return promiseArray;
};
var test = generateSignupPromises(1);
Promise.all([test[0]()])
.then(function() {
console.log('Done');
});
Link zum Ausführen von Code: http://www.es6fiddle.net/imfdtuxc/
Ich kann nicht wirklich sagen, was Sie zu tun versuchen , aber eine 'return' in einem' setTimeout() '- Handler macht praktisch nie viel Sinn; Nichts wird auf den zurückgegebenen Wert achten. – Pointy
Pyramide des Schicksals + Fülle anonymer Funktionen = unlesbarer Code + unerwartetes Verhalten. – Amit
setTimeout ist nicht asynchron. Es wird synchron zurückgegeben, was dazu führt, dass then() undefined und "promise" zurückgibt. Durch das Hinzufügen Ihrer zusätzlichen Zeile wird ein weiteres Versprechen zurückgegeben, das bis zur Auflösung wartet. Übrigens. Dies ist nicht, wie Versprechen verwendet werden sollten. – Wainage