2017-01-17 1 views
0

Ich war auf Versprechungen ein Javascript-Tutorial folgen, here, speziell diesen Code (die nur einen Katzen Würfel simuliert):Javascript-Versprechung: kann ein Parameter, der erfüllt wird, gehen außer Geltungsbereich?

function dieToss() { 
    return Math.floor(Math.random() * 6) + 1; 
} 

function tossASix() { 
    return new Promise(function(fulfill, reject) { 
    var n = Math.floor(Math.random() * 6) + 1; 
    if (n === 6) { 
     fulfill(n); 
    } else { 
     reject(n); 
    } 
    }); 
} 

function logAndTossAgain(toss) { 
    console.log("Tossed a " + toss + ", need to try again."); 
    return tossASix(); 
} 

function logSuccess(toss) { 
    console.log("Yay, managed to toss a " + toss + "."); 
} 

function logFailure(toss) { 
    console.log("Tossed a " + toss + ". Too bad, couldn't roll a six"); 
} 

tossASix() 
    .then(null, logAndTossAgain) //Roll first time 
    .then(null, logAndTossAgain) //Roll second time 
    .then(logSuccess, logFailure); //Roll third and last time 

Ich denke, es ist klar, was es tut, aber als Test, änderte ich den letzten paar Zeilen dazu statt

tossASix() 
    .then(logSuccess, logAndTossAgain) //Roll first time 
    .then(logSuccess, logAndTossAgain) //Roll second time 
    .then(logSuccess, logFailure); //Roll third and last time 

Wenn ich verstehe, Versprechen richtig (bitte Geduld mit mir hier, wie ich bin immer noch versuchen, meinen Kopf um sie zu bekommen) ich hätte gedacht, dass, wenn ich ein 6 auf dem ersten Wurf bekommen , wäre der Ausgang

gewesen
Yay, managed to toss a 6. 
Yay, managed to toss a 6. 
Yay, managed to toss a 6. 

aber in der Tat, was ich bekommen ist

Yay, managed to toss a 6. 
Yay, managed to toss a undefined. 
Yay, managed to toss a undefined. 

Warum ist das so? Bedeutet dies, dass nach dem ersten Aufruf von logSuccess (das heißt erfüllen) der Parameter n den Gültigkeitsbereich verlässt? Wenn ja warum? Hat es etwas damit zu tun, dass das Versprechen nur einmal erfüllt wird und das ist es?

Antwort

1

then Annahme zwei Argumente: die erste ist resolve Rückruf und das zweiter ist reject Rückruf, und gibt eine neues Promise.

Da Sie eine 6 auf den ersten Anruf von tossASix bekommen haben es logAndTossAgain gewohnt nennen, weil Sie es als reject Rückruf passieren und halten nur undefined Werte Anmeldung, weil Funktion logSuccess als resolve gemachten Angaben nicht nichts zurück.

Sie können mehr über die Verkettung von Versprechen lesen here.

0
1: tossASix() 
2: .then(logSuccess, logAndTossAgain) //Roll first time 
3: .then(logSuccess, logAndTossAgain) //Roll second time 
4: .then(logSuccess, logFailure); //Roll third and last time 

Wenn tossASix Auflösungs-/fullfil, logSuccess in Zeile 2 mit dem Argument genannt 6 und die Rückkehr (das ist nicht definiert) übergeben als Argument in logSuccess in Zeile 3 und passieren wieder in Zeile 4.

Wenn Sie sehen wollen zurückkehren wie diese

Yay, managed to toss a 6. 
Yay, managed to toss a 6. 
Yay, managed to toss a 6. 

Sie benötigen n bei logSuccess Funktion zurückzukehren, so wird der Wert in die nächste Funktion übergeben.

+0

ja ich denke, ich habe es, ich fügte tatsächlich eine 'Return Toss;' LogSuccess nach dem Lesen @Panama Prophets Kommentar und es funktioniert. Ich habe nicht bemerkt, dass die .then-Funktion immer etwas zurückgegeben hat, in unserem Fall undefiniert – jazzo

Verwandte Themen