首页
学习
活动
专区
圈层
工具
发布

+回调
EN

Stack Overflow用户
提问于 2016-07-13 00:05:52
回答 2查看 8.2K关注 0票数 2

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

这是我编写的一个示例代码片段:

代码语言:javascript
复制
var f1 = function(){
    var result;
    window.setTimeout(
        function(){
            console.log("timeout in 100ms");
            result = 10;
        }.bind(this), 100);
    return result;
};

因此,我希望函数修改变量结果。我使用.bind(这个)来确保它知道结果。

不过,运行f1()时的输出是9,而不是10,这正是我所希望的。

有什么线索吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-07-13 00:22:43

结果是一个数字。因此,它作为值9返回,而不是对对象的引用。

bind在您的场景中没有任何有用的效果。bind更改函数上下文(this)。

返回包含值10的对象将有效。

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

你的问题可能有更好的解决方案。

回调:

代码语言:javascript
复制
var f1 = function(valueCallback){
        var result;
        window.setTimeout(function(){
            console.log("timeout in 100ms");

            result = 10;
            valueCallback(result);
};

这样一种功能的使用方式如下:

代码语言:javascript
复制
f1(function(value)) {
    console.log(value); // Will print 10 after 100ms. 
})

另一种选择,可以使用承诺:

代码语言:javascript
复制
var f1 = function() {
    return new Promise(function(resolve, reject) {
        window.setTimeout(resolve.bind(null, 10), 100);
    }
}

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

代码语言:javascript
复制
f1().then(function(value) {
   console.log(value); // Will print 10 after 100ms.
});
票数 4
EN

Stack Overflow用户

发布于 2016-07-13 00:23:37

您正在调用超时值,以便在函数返回后修改该值,因此它返回结果的默认值,然后调用超时,而且由于该值的作用域仅限于该函数,因此您无法在修改后返回它。

你能做的就是

代码语言:javascript
复制
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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38340674

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档