Hier ist meine Situation:Async Funktion innerhalb Promises
fetchData(foo).then(result => {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve(result + bar);
}, 0)
});
}).then(result => {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve(result + woo);
}, 0)
});
}).then(result => {
setTimeout(() => {
doSomething(result);
}, 0)
});
Wo jeder SetTimeout ist ein anderer Asynchron-Betrieb des Callback-Muster.
Es ist wirklich schmerzhaft jede Funktion in einem Versprechen zu wickeln, ich fühle mich wie der Code soll wie folgt aussehen:
fetchData(foo).then(result => {
setTimeout(() => {
return result + bar;
}, 0)
}).then(result => {
setTimeout(() => {
return result + woo;
}, 0)
}).then(result => {
setTimeout(() => {
doSomething(result);
}, 0)
});
Offensichtlich ist dies nicht funktioniert.
Nutze ich Promises richtig? Muss ich wirklich alle vorhandenen asynchronen Funktionen in Versprechen einbinden?
EDIT:
Eigentlich merke ich mein Beispiel für meine Situation nicht völlig reprensentative war, habe ich nicht machen deutlich, dass die setTimeout in meinem Beispiel zu verstehen ist en async Betrieb reprensent. Diese Situation ist repräsentativer für meine Situation:
fetchData(foo).then(result => {
return new Promise((resolve, reject) => {
asyncOperation(result, operationResult => {
resolve(operationResult);
}, 0)
});
}).then(result => {
return new Promise((resolve, reject) => {
otherAsyncOperation(result, otherAsyncResult => {
resolve(otherAsyncResult);
}, 0)
});
}).then(result => {
doSomething(result);
});
Sie können benutzerdefiniertes Ereignis verwenden, wenn Sie nicht versprechen wollen. Dieses Ereignis wird bei jeder Erkennungsänderung ausgelöst! (https://www.sitepoint.com/javascript-custom-events/) .... Aber warum Sie nicht gerne Versprechen verwenden? –
Es gibt Module wie ['pify'] (https://github.com/sindresorhus/pify), mit denen Sie vorhandene Callback-basierte Async-Funktionen promotifizieren können. Außerdem bietet eine angemessene Anzahl von Paketen _both_ Versprechen und Callback-Unterstützung für ihre asynchronen Funktionen (wenn Sie keine Callback-Funktion übergeben, geben sie eine Zusage zurück). Aber ich kann nicht sagen, ob das auf Ihre Situation zutrifft. – robertklep
^^ yeah oder 'bluebird' ist sehr einfach und verhält sich genau wie native Promises, aber freundlicher für Callbacks im Node-Stil. [link] (http://bluebirdjs.com/docs/api/promise.fromcallback.html) – user3821538