繁体   English   中英

jQuery异步调用顺序

[英]Jquery async calls in order

我是Jquery的新手,有一些代码循环遍历数组,并在每次循环迭代时从ajax请求中加载HTML:

$.each(arr, function (data) {
    $.get('/Quote/LoadQuoteItemCost', { 'i': i }, function (html) {
        $('#myTable).append(html);
        // There are a few more lines which modify the html which I've left out
    });
    i++;
});

我的问题是,由于JQuery的异步特性,我认为响应是以随机顺序附加到#myTable的。 如何确保我的响应按照遍历数组的顺序添加到表中?

我尝试过async = false,但是在我的浏览器中已经贬值了(并且看到很多帖子说不使用它)

这是我将使用本机(对于某些浏览器)进行操作的方式

Promise.all(arr.map(function(data, i) {
    return $.get('/Quote/LoadQuoteItemCost', { 'i': i });
})).then(function(results) {
    results.forEach(function (html, n) {
        var data = arr[n];
        $('#myTable').append(html);
        ...
    });
});

jQuery的等效项似乎是$.when ,但是它接受多个(promise)参数(而不是Promises数组),并且then函数接收多个“结果”,而不是单个结果数组-因此整个过程将与上面的“(几乎)纯JS”有些不同-但这应该可以助您一臂之力

编辑:我觉得这样做很脏,但是我相当有信心这会比我不喜欢的情况下使用更多的jQuery来完成你想要的:p

$.when.apply(null, $.map(arr, function(data, i) {
    return $.get('/Quote/LoadQuoteItemCost', { 'i': i });
})).then(function() {
    $.each(arguments, function (n, html) {
        var data = arr[n];
        $('#myTable').append(html);
        ...
    });
});

我现在在小提琴和代码中在注释中解释的概念:

var responses = [],
    highestNumber = -1,
    highestReceivedNumber = -1;
function handleResponse(id, data) {
    highestReceivedNumber = Math.max(highestReceivedNumber, id);
    responses[id] = data;
    if(id===highestNumber+1)
        for(i=id;i<=highestReceivedNumber;i++)
            if(!responses[i]) return;
            else $('div:eq(0)').append(responses[i]) && highestNumber++;
}

看看这个小提琴: http : //jsfiddle.net/4udeg6wz/

在$ .get成功之前,您应该对$ .get进行其他调用,并以递归的方式进行回调,并在整个数组“ arr”被消耗时保持计数器/变量停止递归。 这样,只有在先前的$ .get的响应返回后,才会启动下一个$ .get。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM