können Sie meist entweder in diesem Fall (mit einem Verhalten Unterschied). Die erste ist die Standardversprechensfunktionalität und funktioniert mit jeder beliebigen Versprechungsbibliothek.
Promise.try()
ist ein Feature, das speziell von der Bluebird-Bibliothek implementiert wurde und ist nicht Teil eines mir bekannten Standardprozesses.
Der Grund für die Verwendung von Promise.try()
ist, wenn Sie eine Funktion haben, die ein Versprechen zurückgibt, aber der Code, der dieses Versprechen generiert, kann auch eine synchrone Ausnahme verursachen. Da diese Ausnahme nicht in einem Verspreenter-Handler enthalten ist, haben Sie eine Mischung aus Fehlerbehandlung. Einige Codeausführungspfade können dazu führen, dass ein Versprechen zurückgegeben wird, das auflösen oder zurückweisen würde, und andere Codeausführungspfade könnten eine Ausnahme auslösen. Um dies sicher zu verschlüsseln, müssten Sie beide auf das Versprechen reagieren und einen try/catch-Block um den Code setzen, der unhandlich wird.
Promise.try()
ist einfach ein Mittel zum automatischen Abfangen von Ausnahmen und deren Umwandlung in eine Zurückweisung (ähnlich wie in Handlern).
In Ihren beiden Fällen profitieren Sie Promise.try()
nicht auf diese Weise, weil der Rückruf new Promise()
bereits Ausnahmen abfängt und sie in Ablehnungen umwandelt, so dass die Funktionalität dort für Sie bereits ausgeführt wird. Sie können das hier demonstriert sehen: http://jsfiddle.net/jfriend00/wLov9844/
Die Drossel-doc dieses Beispiel bietet das den Vorteil deutlicher zeigt:
function getUserById(id) {
return Promise.try(function() {
if (typeof id !== "number") {
// Courtesy of Promise.try() this exception will be turned
// into a returned promise that is rejected with the
// exception as the reason
throw new Error("id must be a number");
}
return db.getUserById(id);
});
}
getUserById().then(successFn, errFn);
Die Verwendung von Promise.try()
hier stellt sicher, dass getUserById()
ein Versprechen immer wieder zurückkehren, auch wenn der Code innerhalb dieser Methode löst eine Ausnahme synchron aus. Dies vereinfacht die Verwendung von getUserById()
, da Sie immer nur auf das Versprechen reagieren können und nicht Ihren eigenen Ausnahme-Handler darum verwenden müssen.
Ohne Promise.try()
, könnten Sie die gleiche Sache selbst wie dieser Code (alle möglichen synchronen Ausnahmen innerhalb der Funktion zu fangen):
function getUserById(id) {
try {
if (typeof id !== "number") {
throw new Error("id must be a number");
}
return db.getUserById(id);
} catch(e) {
return Promise.reject(e);
}
}
getUserById().then(successFn, errFn);
Oder Sie es wie folgt Code könnte:
function getUserById(id) {
if (typeof id !== "number") {
throw new Error("id must be a number");
}
return db.getUserById(id);
}
try {
getUserById().then(successFn, errFn);
} catch(e) {
errFn(e);
}
Vermutlich können Sie sehen, wie Promise.try()
unter bestimmten Umständen die Dinge vereinfachen kann.
FYI, in Ihrem ersten Beispiel verwenden Sie ungültige Syntax.Sie können dies tun:
reject(throw new Error('error'));
Ich gehe davon aus, was du damit gemeint war:
reject(new Error('error'));
Obwohl ich nicht glaube, das ist wirklich, was Sie fragten, Promise.try()
wird auch geben automatisch ein aufgelöstes Versprechen zurück, wenn Sie kein Versprechen selbst zurückgeben. Da ein Pfad in Ihrem ersten Beispiel nicht aufgelöst oder abgelehnt wird, führt dies zu einem Unterschied in Ihren beiden Beispielen.
lose verwandt: [Promise.reject vs Wurf Fehler] (http://stackoverflow.com/q/28703241/1048572). Sie sollten den Konstruktor "new Promise" nicht verwenden, wenn Sie nicht gerade etwas Asynchrones tun. Der richtige Ansatz wäre, 'Promise.reject (...)' zurückzugeben (oder 'Promise.try' /' Promise.method' zu verwenden). – Bergi