Was ist der Unterschied zwischen dann und schließlich in einem Versprechen?

Sehe ich die docs für den Bluebird ' s endlich aber ich verstehe immer noch nicht ganz verstehen, die Differenz vs. then.

Klar zu sein: ich weiß genau, warum then wird aufgerufen, nachdem eine catch. Ich wollen es, um aufgerufen werden, nachdem ein Fang. Das ist die Absicht. Meine Frage ist: Wenn ich wollen code immer ausgeführt werden, unabhängig von dem Staat Versprechen, was ist der Unterschied zwischen then vs finally?

Baute ich diesen test:

var Promise = require("bluebird");

function test1 () {
    console.log("RESOLVE + THEN + CATCH + THEN");
    return new Promise((resolve, reject) => resolve())
       .then(() => console.log("then"))
       .catch(err => console.log("error:", err.message))
       .then(() => console.log("end"));
}

function test2 () {
    console.log("REJECT + THEN + CATCH + THEN");
    return new Promise((resolve, reject) => reject(new Error("rejected")))
       .then(() => console.log("then"))
       .catch(err => console.log("error:", err.message))
       .then(() => console.log("end"));
}

function test3 () {
    console.log("RESOLVE + THEN + CATCH + FINALLY");
    return new Promise((resolve, reject) => resolve())
       .then(() => console.log("then"))
       .catch(err => console.log("error:", err.message))
       .finally(() => console.log("end"));
}

function test4 () {
    console.log("REJECT + THEN + CATCH + FINALLY");
    return new Promise((resolve, reject) => reject(new Error("rejected")))
       .then(() => console.log("then"))
       .catch(err => console.log("error:", err.message))
       .finally(() => console.log("end"));
}

//run tests "sequentially" so console output doesn't get blended
setTimeout(test1, 500);
setTimeout(test2, 1000);
setTimeout(test3, 1500);
setTimeout(test4, 2000);

Diese tests vier Fällen:

  1. .then(...).catch(...).then(...) mit einer abgeschlossenen Versprechen.
  2. .then(...).catch(...).then(...) mit einer Ablehnung Versprechen.
  3. .then(...).catch(...).finally(...) mit einer abgeschlossenen Versprechen.
  4. .then(...).catch(...).finally(...) mit einer Ablehnung Versprechen.

Den Ergebnissen, die ich sehen, sind die Fälle 1+2 verhält sich identisch zu 3+4: Das Letzte bit (then oder finally je nach test) ausführt, egal, was passiert, bevor es, so wie vorgesehen. Die Ausgabe des Programms ist:

RESOLVE + THEN + CATCH + THEN
then
end
REJECT + THEN + CATCH + THEN
error: rejected
end
RESOLVE + THEN + CATCH + FINALLY
then
end
REJECT + THEN + CATCH + FINALLY
error: rejected
end

Nun, der Grund warum ich Frage ist, weil ich sah eine Kommentar zu dieser anderen Frage habe ich gefragt:

Nicht sicher, ob Sie Ihre Versprechungen, die Sie unterstützen, aber Sie sollten die letzten .then zu .finally so, dass die busy wird immer gelöscht.

Aus meiner sehr begrenzten wissen über then, und die oben genannten tests, es scheint, wie then ist ausreichend. Aber nach diesem Kommentar bin ich hinterfragen, mich selbst und über die Sicherheit der Verwendung von then ausführen "finally" code.

Also meine Frage ist: Was ist der Unterschied zwischen then und finally? Sie Aussehen wie Verhalten Sie sich der gleichen, aber wenn würde ich finally statt then?

wenn Sie immer fangen abgelehnt verspricht, heißt, Sie hat immer nur gelöst verspricht, dann gibt es natürlich wenig Unterschied... Bin ich fehlt der Punkt deiner Frage? dies alles scheint auf der Hand..
Es ist für Fälle, in denen die Versprechen könnte entweder gelöst werden, oder abgelehnt. In Ihrem Fall ist es immer gelöst, so dass es keinen Unterschied gibt.
die .fangen lässt es gelöst Versprechen..
1.: manchmal wollen Sie nicht fangen die Fehler an der Stelle, an der Sie entstehen, sondern in den Code, der diese Funktion nutzt, so dass Sie nicht fangen Sie. In diesem Fall können Sie nicht ersetzen then() und finally(). Manchmal muss man sauber sth. bis zu entscheiden, ob es ein Fehler war oder nicht. (nulling-Referenzen clearing-timeouts, ... stuff like that) das ist, wo Sie verwenden finally(). 2.: Die Funktion Sie passieren zu catch() könnte auch werfen, dann haben Sie abgelehnt Versprechen und die folgenden then() würde nicht aufgerufen werden.
gut, jetzt kann man nicht löschen. problem gelöst!

InformationsquelleAutor Jason C | 2016-12-13

Schreibe einen Kommentar