JavaScript循环并等待函数

JavaScript循环并等待函数,javascript,jquery,arrays,function,loops,Javascript,Jquery,Arrays,Function,Loops,我有一个简单的一维数组,比方说: fruits = ["apples","bananas","oranges","peaches","plums"]; 我可以使用$循环。每个()函数函数: $.each(fruits, function(index, fruit) { showFruit(fruit); }); 但是我正在调用另一个函数,在继续下一项之前,我需要完成这个函数 如果我有这样一个函数: function showFruit(fruit){ $.getScript

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

fruits = ["apples","bananas","oranges","peaches","plums"];
我可以使用
$循环。每个()函数
函数:

$.each(fruits, function(index, fruit) {  
   showFruit(fruit);
});
但是我正在调用另一个函数,在继续下一项之前,我需要完成这个函数

如果我有这样一个函数:

function showFruit(fruit){
    $.getScript('some/script.js',function(){
        // Do stuff
    })
}
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
    }

})();

在继续之前,最好的方法是什么来确保前面的结果已经被添加?

浏览器中的Javascript是单线程的。直到它调用的函数返回,它才会继续。您不需要检查。

如果您希望在加载下一个水果之前附加一个水果,那么您就无法按照现有的方式构造代码。这是因为对于像
$.getScript()
这样的异步函数,无法让它等到完成后再继续执行。可以使用
$.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();

})();

数组:
fruits=[]
。你拥有的是一个物体。仅供参考。@ahren这不是对象,这是语法错误;)但是您的代码没有您期望的行为?很抱歉,最近JSON太多了,我使用的代码工作正常,它只会导致错误,因为它无法完成上一个函数调用。让我猜猜,当您调用
showFruit
时,
#一些div
在DOM中不存在,你想知道为什么没有任何元素出现。。。。除非函数是异步的。但本例中并非如此,我调用的函数调用其他脚本,这些脚本的动态加载似乎并没有停止下一个循环proceed@Fluidbyte,您需要制作一个简化的测试用例是的,请为我们提供最简单的版本,该版本无法工作。
$.getScript()
及其相关的完成回调是异步的,所以这个答案对于这个特定的问题是不正确的。比我的答案好得多-它有助于了解jQuery。
fruits[i]应为<代码>水果[索引]我假设的最后一秒变量名更改::-)我试图编辑,但更改中没有足够的字符。@graystateiscoming-已修复。Thx.添加了一个带有
async/await
的ES7示例。