0

考虑以下代码:

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。谢谢!

4

1 回答 1

2

您可以使整个循环和 超时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]);
于 2013-01-10T17:44:36.063 回答