Javascript settimeout +回调

时间:2016-07-13 00:05:53

标签: javascript callback settimeout

我有一个与回调和超时相关的JavaScript问题。

这是我写的示例代码段:

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,这是我所希望的。

任何线索?

2 个答案:

答案 0 :(得分: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. 
})

另一种选择,可以使用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.
});

答案 1 :(得分:0)

您正在调用超时以在函数已返回后修改该值,因此它返回结果的默认值,然后调用超时,并且因为该值的范围受限于函数,您无法返回它经过修改后。

你能做的就是这个

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