Javascript - setTimeout Closure Issue

Я борюсь с приведенным ниже кодом. Я пробовал много разных способов сделать это, но в итоге получил один из двух неверных результатов.

for(i = 0; i < result.length; i++) {

    var tmpBlockInfo = {
        size: worldTest.data[0].size,
        xStartPixel :  result[i].x * worldTest.data[0].size,
        yStartPixel : result[i].y * worldTest.data[0].size,
        blockType : (Math.random() * 100 > 10) ? 'path' : 'wall'
    }

    var tmpFunc = function(){
        worldTest.fillBlock(tmpBlockInfo, 157, 152, 124,  255)
    };

    var t = setTimeout(function(){
        tmpFunc()
    } , 500 * i);
}

Проблема с приведенным выше кодом заключается в том, что tmpBlockInfo всегда получает последний результат [i] .x / result [i] .y.Итак, я предполагаю, что когда тайм-аут запускает функцию, она видит, какой результат [i] .x / result [i] .y остался после цикла (вместо того, чтобы передавать его как «новую» переменную)

Я подумал включение его в функцию устранит проблему с закрытием, но безуспешно.

Также пробовали:

for(i = 0; i < result.length; i++) {

    var tmpBlockInfo = {
        size: worldTest.data[0].size,
        xStartPixel :  result[i].x * worldTest.data[0].size,
        yStartPixel : result[i].y * worldTest.data[0].size,
        blockType : (Math.random() * 100 > 10) ? 'path' : 'wall'
    }

    var t = setTimeout(function(){
        worldTest.fillBlock(tmpBlockInfo, 157, 152, 124,  255)
    } , 10000 * i);
}

С теми же результатами, что и в первом коде.

Если я это сделаю:

for(i=0; i < result.length; i++) {

    var tmpBlockInfo = {
        size: worldTest.data[0].size,
        xStartPixel :  result[i].x * worldTest.data[0].size,
        yStartPixel : result[i].y * worldTest.data[0].size,
        blockType : (Math.random() * 100 > 10) ? 'path' : 'wall'
    }

    setTimeout(function(passBlockInfo) {
        worldTest.fillBlock(tmpBlockInfo, 157, 152, 124,  255) 
    } (tmpBlockInfo), 1000 * i);
}

Он правильно обрабатывает все функции fillBlock. НО он выполняет их все одновременно (например, он не запускает их по одному. Он просто выполняет их друг за другом, но вызывает блокировку (без обновления экрана) и без задержки между каждым из них.

Любая помощь с этим будет будь отличным!

7
задан John Strickler 28 February 2012 в 16:03
поделиться