【问题标题】:Javascript settimeout + callback [duplicate]Javascript settimeout +回调[重复]
【发布时间】:2016-11-15 09:24:05
【问题描述】:

我有一个关于回调和超时的 javascript 问题。

这是我写的示例代码sn-p:

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

所以,我希望函数修改变量结果。我使用 .bind(this) 来确保它知道它的结果。

不过,我运行 f1() 时的输出是 9,而不是 10,这是我想要的。

有什么线索吗?

【问题讨论】:

标签: javascript callback settimeout


【解决方案1】:

结果是一个数字。因此,它作为值 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. 
})

另一种选择,可以使用 Promises:

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

你可以这样调用这样的函数:

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

【讨论】:

  • 因此,对于解决方案,最初将返回值 9。例如,如果你执行 var a =f1(),那么在 100 毫秒后,a 的值将变为 10。
  • 啊,谢谢。我不知道 Promise 是标准的 Javascript,总是认为它是包的一部分。这很有帮助,谢谢!
【解决方案2】:

你是在函数已经返回后调用超时来修改值,所以它返回结果的默认值,然后调用超时,由于该值仅限于函数的范围,你没有办法返回修改后的。

你能做的就是这个

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

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

然后在调用 f1 t 后会返回 9 然后调用 result 会显示 10

【讨论】:

    猜你喜欢
    • 2021-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-03
    • 2013-01-25
    • 1970-01-01
    • 2017-03-19
    • 1970-01-01
    相关资源
    最近更新 更多