javascript - setTimeout 在循环中并传递变量以供稍后使用

标签 javascript

考虑以下代码:

function func() {
    var totalWidths = 0;
    for( var i = 0, count = arr.length; i < count; i++ ) {
        var image = arr[i];

        insertElemInDOM(image);

        preloadImage(image,function(){
            var w = image.width();
            totalWidths += w;
        });

    }
    // do something with the variable "totalWidths"
    doSomething(totalWidths)
}

我这里有两个问题。图像将始终相同(第一个问题),可以使用匿名函数解决:

    for(...) {
        (function(image) {
            preload(image,function() {
                // now image is the correct one
            });
        })(image);
    }

但是我如何管理totalWidths变量以便稍后在doSomething(totalWidths)上使用它?前面的代码的totalWidths 值为0。 谢谢!

最佳答案

您可以使整个循环和 doSomething 超时,这比设置这么多超时的性能要高得多:

setTimeout(function() {
    var inc = 0;
    for (var i = 0; i < count; i++) {
        var w = arr[i].width();
        inc++;
    }
    doSomething(inc);
}, 1000);
<小时/>

但是,您实际上想要的是嵌套超时,即每个迭代步骤等待 1 秒,并在所有完成后执行某些操作:

var inc = 0, count;
function asyncLoop(i, callback) {
    if (i < count) {
        var w = arr[i].width();
        inc++;
        setTimeout(function() {
            asyncLoop(i+1, callback);
        }, 1000);
    } else {
        callback();
    }
}
asyncLoop(0, function() {
    doSomething(inc);
});
<小时/>

好的,现在我们知道您需要什么,解决方案是在每个加载事件后检查是否所有图像都已加载:

var totalWidths = 0,
    count = arr.length,
    loaded = 0;
for (var i = 0; i < count; i++) 
    (function (image) {
        insertElemInDOM(image);
        preload(image, function() {
            totalWidths += image.width();
            // counter:
            loaded++;
            if (loaded == count-1) // the expected value
                doSomething(totalWidths); // call back
        });
    })(arr[i]);

关于javascript - setTimeout 在循环中并传递变量以供稍后使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14263958/

相关文章:

javascript - Dojo 附加事件到动态创建的元素

javascript - 如果 url (get) 存在,函数不会执行

javascript - 没有换行符的多行模板字符串?

javascript - TypeScript 和 JavaScript : Communicate using events with content

javascript - 使用 jQuery 检测表单文件中的更改

javascript - 关于在 Phonegap Build 上将 HTML 渲染为图像或将屏幕截图渲染为图像有什么想法吗?

javascript - react 原生 redux 状态更新但不在组件中渲染

javascript - 混合每个 Underscore 方法作为 Collection#models 的代理

javascript - NodeJS : How to use async. js处理数据库中的项目列表

javascript - 检查选中的组单选按钮 - 验证