使用AJAX在PHP服务器上执行一组顺序任务

时间:2017-04-12 00:02:30

标签: javascript php jquery ajax

我对AJAX固有的异步性问题与我想要完成的事情有关......

使用文件上传表单,我尝试将一组数据发送到我的LAMP服务器,然后该服务器循环遍历每个数据子集并为每个子集生成PDF。这需要2分钟左右的时间来处理所有PDF,因为每个数据子集都会生成很多(如100)。

我希望使用JavaScript / jQuery将数据分段为我将一次发布到服务器的子集,并且在生成每个PDF时,从服务器获取响应并递增进度条,然后发送下一个请求。

你会如何在一个循环中完成这个?下面的内容并不起作用,因为jQuery并不关心服务器的状态并且异步发送所有请求。

var i = 0;
$.each(data_stuff, function(key, value) {
    $.post( window.location.href, { 
        stuff: key,
        data: value
    }).done(function( data ) {
        if (data == 1) {
            $('div#counter').text(i);
        }
    });                         
    $i++;
});

谢谢!

1 个答案:

答案 0 :(得分:2)

假设data_stuff是一个对象,你可以试试这个:

var i = 0;

// We need an array (not object) to loop trough all the posts. 
// This saves all keys that are in the object:
var keys = Object.keys(data_stuff);

function postNext() {

    // For every POST request, we want to get the key and the value:
    var key = keys[i];
    var value = data_stuff[key];

    $.post( window.location.href, { 
        stuff: key,
        data: value
    }).done(function( data ) {
        if (data == 1) {
            $('div#counter').text(i);
        }

        // Increment i for the next post
        i++;

        // If it's the last post, run postsDone
        if(i == keys.length) {
            postsDone();
        }
        // Else, run the function again:
        else {
            postNext();
        }
    });
});

postNext();

function postsDone() {
    // All data was posted
}

这只会在上一次data_stuff完成后发布$.post的下一位。