如何通过jQuery和Queue发送ajax请求?

时间:2015-10-14 23:53:34

标签: jquery ajax asynchronous

好吧,我有一个" ID"我需要为每个" ID"发送一个Ajax请求。 ides是当请求完成时,运行以下Ajax请求。 所有这些都是异步请求,否则,浏览器实际上是#34;停止"直到请求完成加载。

逻辑非常简单: 我们在循环中创建一个循环,并根据ID创建一个Ajax请求asinconica。 问题是异步Ajax请求阻止我访问全局变量ID。

示例:

// This list will always have 40 items/values.
var ids = [12,3453,234,743,235,433, ..];
for (var index = 0; index < ids.length; index++) {
    // This request take long time( 40-60 seconds)
    $.ajax({
        url        :    'http://website.com/id=' + ids[index], // See here how to call to global variable ids
        success    :    function (response) {
            // And here, i call the element '#element' and get and set the 'value text'
            var currentTotal = parseInt($('#element').text());
            $'#element').text(currentTotal  + response.total);
        },
        async:true // See here, this is a Async request
    });
}

请注意,每个请求必须在上一次完成加载后发送,并且始终是动态列表,因为有时我必须发送不同的ID。

2 个答案:

答案 0 :(得分:2)

你可以试试。我已经删除了for循环,并且只有在上一次调用成功后才会增加索引,从而启动下一个调用。

// This list will always have 40 items/values.
var ids = [12,3453,234,743,235,433, ..];
var index = 0;
RequestAjax(ids,index);

function RequestAjax(ids,index)
{    
    if(ids.length > index)
    {
    // This request take long time( 40-60 seconds)
    $.ajax({
        url        :    'http://website.com/id=' + ids[index], // See here how to call to global variable ids
        success    :    function (response) {
            // And here, i call the element '#element' and get and set the 'value text'
            var currentTotal = parseInt($('#element').text());
            $'#element').text(currentTotal  + response.total);
            RequestAjax(ids,index++);
        },
        async:true // See here, this is a Async request
    });
    }
}

答案 1 :(得分:1)

我认为DinoMyte的答案很有用。 根据@ DinoMyte的回答,您还可以使用.push().shift()来操纵数组ids

// This list will always have 40 items/values.
var ids = [];
Manipulate([12,3453,234,743,235,433]);

function RequestAjax()
{    
    if(ids.length > 0)
    {
    var id = ids.shift();
    // This request take long time( 40-60 seconds)
    $.ajax({
        url        :    'http://website.com/id=' + id,
        success    :    function (response) {
            // And here, i call the element '#element' and get and set the 'value text'
            var currentTotal = parseInt($('#element').text());
            $'#element').text(currentTotal  + response.total);
            RequestAjax();
        },
        async:true // See here, this is a Async request
    });
    }
}

function Manipulate(id)
{
    var shouldRequest = false;
    if(0 === ids.length){
        shouldRequest = true;
    }

    if(toString.apply(id) === '[object Array]'){
        ids = ids.concat(id);
    }else if('number' === typeof id){
        ids.push(id);
    }

    if(shouldRequest === true && ids.length > 0){
        RequestAjax();
    }
}