2016-07-13 59 views
0

我有一個關於回調和超時的javascript問題。Javascript settimeout + callback

這是一個示例代碼片段我寫道:

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

所以,我希望函數修改變量的結果。我使用.bind(這個)來確保它知道它的結果。

還是,當我運行f1()時輸出爲9,而不是10,這正是我所希望的。

任何線索?

+0

[爲什麼是我的變量不變後,我修改它的內部函數?](https://stackoverflow.com/questions/23667086/why-is-my-variable-unaltered-after-i-modify-it-inside-of-a-function-asynchron) –

+1

[我如何返回來自異步調用的響應?](https://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous-call) –

+0

'.bind(this)'has沒有相關性e變量;只會影響'this'關鍵字的值。而且,如果您因此收到「9」,您的片段似乎缺乏一些東西。 –

回答

4

結果是一個數字。因此它返回值9不是對象的引用。

bind在您的方案中沒有任何有用的效果。 bind更改函數上下文(this)。

返回包含值10的對象將起作用。

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

有可能是您的問題更好的解決方案。

回調:

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

      result = 10; 
      valueCallback(result); 
}; 

這樣的功能將被用於像這樣:

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

另一種選擇,可以使用承諾:

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

你會打電話SUC HA功能,像這樣:

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

因此,對於解決方案,最初將返回9的值。 如果你說var a = f1(),那麼在100ms後,a的值將改爲10. – MiaoMiao

+0

啊,謝謝。我不知道Promise是標準的Javascript,總是認爲它是包的一部分。這很有幫助,謝謝! – MiaoMiao

0

您所呼叫的超時值修改已經返回的功能之後,所以它返回結果的默認值,然後調用超時,並自該值的範圍僅限於該功能,你沒有辦法修改後返回它。

你可以做的就是這個

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

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

,然後調用F1 to後會返回9隨後致電result,它會顯示10