JavaScript循环并等待功能

Flu*_*yte 7 javascript arrays jquery loops function

我有一个简单的单维数组,让我们说:

fruits = ["apples","bananas","oranges","peaches","plums"];
Run Code Online (Sandbox Code Playgroud)

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

$.each(fruits, function(index, fruit) {  
   showFruit(fruit);
});
Run Code Online (Sandbox Code Playgroud)

但我正在调用另一个我需要完成的功能才能继续下一个项目.

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

function showFruit(fruit){
    $.getScript('some/script.js',function(){
        // Do stuff
    })
}
Run Code Online (Sandbox Code Playgroud)

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

jfr*_*d00 15

如果您想在加载下一个水果之前添加一个水果,那么就无法按照您的方式构建代码.那是因为使用异步函数$.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();

})();
Run Code Online (Sandbox Code Playgroud)

在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
    }

})();
Run Code Online (Sandbox Code Playgroud)