9

我有一个简单的一维数组,比方说:

fruits = ["apples","bananas","oranges","peaches","plums"];

我可以使用 with$.each()函数循环:

$.each(fruits, function(index, fruit) {  
   showFruit(fruit);
});

但我正在调用另一个函数,我需要在继续下一个项目之前完成该函数。

所以,如果我有这样的功能:

function showFruit(fruit){
    $.getScript('some/script.js',function(){
        // Do stuff
    })
}

在继续之前确保已附加上一个水果的最佳方法是什么?

4

2 回答 2

19

如果您希望在加载下一个水果之前附加一个水果,那么您无法按照您的方式构建代码。那是因为对于像这样的异步函数$.getScript(),没有办法让它等到完成后再继续执行。可以使用 a$.ajax()并将其设置为同步,但这对浏览器不利(它会在联网期间锁定浏览器),因此不建议这样做。

相反,您需要重组代码以异步工作,这意味着您不能使用传统的for.each()循环,因为它们不会异步迭代。

var fruits = ["apples","bananas","oranges","peaches","plums"];

(function() {
    var index = 0;

    function loadFruit() {
        if (index < fruits.length) {
            var fruitToLoad = fruits[index];
            $.getScript('some/script.js',function(){
                // Do stuff
                ++index;
                loadFruit();
            });
        }
    }
    loadFruit();

})();

在 ES7 中(或者在转译 ES7 代码时),你也可以使用asyncawait这样的:

var fruits = ["apples","bananas","oranges","peaches","plums"];

(async function() {
    for (let fruitToLoad of fruits) {
        let s = await $.getScript('some/script.js');
        // do something with s and with fruitToLoad here
    }

})();
于 2012-09-10T21:35:24.667 回答
1

浏览器中的 Javascript 是单线程的。在它调用的函数返回之前,它不会继续。你不需要检查。

于 2012-09-10T21:08:32.833 回答