2016-07-13 21 views
0

Ich habe eine Javascript-Frage in Bezug auf Rückruf und Timeout.Javascript settimeout + Rückruf

Dies ist ein Beispiel-Code-Snippet Ich schrieb:

var f1 = function(){ 
    var result; 
    window.setTimeout(
     function(){ 
      console.log("timeout in 100ms"); 
      result = 10; 
     }.bind(this), 100); 
    return result; 
}; 

Also, ich möchte die Funktion die Variable Ergebnis ändern. Ich habe .bind (this) verwendet, um sicherzustellen, dass es weiß, was daraus resultiert.

immer noch die out, wenn ich f1() laufen ist 9, nicht 10, was ist, was ich wollte.

Irgendwelche Hinweise?

+0

[Warum meine Variable unverändert ist, nachdem ich es innerhalb von einem ändern Funktion?] (https://stackoverflow.com/questions/23667086/why-is-my-variable-unterned-after-i-modify-it-inside-of-a-function-asynchron) –

+1

[Wie komme ich zurück? die Antwort von einem asynchronen Anruf?] (https://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous-call) –

+0

'.bind (this)' hat nicht relevant e zu Variablen; Das wirkt sich nur auf den Wert des Schlüsselworts "this" aus. Und Ihrem Schnipsel scheint etwas zu fehlen, wenn Sie als Ergebnis "9" erhalten. –

Antwort

4

Ergebnis ist eine Zahl. Daher wird als Wert 9 kein Verweis auf ein Objekt zurückgegeben.

bind hat keinen nützlichen Effekt in Ihrem Szenario. bind ändert den Funktionskontext (this).

Die Rückgabe eines Objekts mit dem Wert 10 funktioniert.

var f1 = function(){ 
     var result = { value: 9 }; 
     window.setTimeout(
          function(){ 
          console.log("timeout in 100ms"); 
          result.value = 10;}.bind(this), 100); 
     return result; 
}; 

Es gibt wahrscheinlich bessere Lösungen für Ihr Problem.

Rückrufe:

var f1 = function(valueCallback){ 
     var result; 
     window.setTimeout(function(){ 
      console.log("timeout in 100ms"); 

      result = 10; 
      valueCallback(result); 
}; 

Eine solche Funktion wie so verwendet werden würde:

f1(function(value)) { 
    console.log(value); // Will print 10 after 100ms. 
}) 

Eine weitere Alternative könnte Promises verwenden:

var f1 = function() { 
    return new Promise(function(resolve, reject) { 
     window.setTimeout(resolve.bind(null, 10), 100); 
    } 
} 

Sie nennen würde Erfolg ha Funktion wie so:

f1().then(function(value) { 
    console.log(value); // Will print 10 after 100ms. 
}); 
+0

Also, für die Lösung, Wert von 9 wird zunächst zurückgegeben. Wenn Sie sagen, Sie var a = f1(), dann wird nach 100ms Wert von a auf 10 geändert werden. – MiaoMiao

+0

Ah, danke. Ich wusste nicht, dass Promise Standard-Javascript ist, immer vorausgesetzt, dass es Teil eines Pakets ist.Das war hilfreich, danke! – MiaoMiao

0

Sie rufen den Timeout den Wert zu ändern, nachdem die Funktion bereits zurückgegeben, so dass er den Standardwert für Ergebnis zurückgibt, dann das Timeout rufen, und da der Wert im Umfang begrenzt ist die Funktion, Sie haben keine Möglichkeit, es nach der Änderung zurückzugeben.

Was können Sie tun, ist dies

var result = 9; 
var f1 = function(){ 

      window.setTimeout(
           function(){ 
           console.log("timeout in 100ms"); 
           result = 10;}.bind(this), 100); 
      return result;}; 

Und dann nach f1 t Aufruf kehrt 9 dann result anrufen und es wird zeigen, 10