2016-07-13 64 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