使用ajax加超时的承诺?

时间:2017-04-07 01:43:43

标签: javascript jquery ajax promise requestanimationframe

我正在编写一个脚本来进行异步调用以获取一堆数组数据(约50,000个项目),使用requestanimationframe()多次迭代该数据,然后进行另一次调用并迭代这些结果,几个次。

我希望在完成与前一批次的requestanimationframe循环后,尽快开始迭代后续调用中的数据。我想要的是在第一批处理时对下一批进行异步调用,然后只要1)该调用返回并且2)requestanimationframe()迭代完成,就开始处理下一批

我正在使用jquery。如果我在等待2个ajax调用,我会使用$ .when()和done()。但我的第二个条件不是ajax回归。我希望避免像第二个条件满足后用第二个条件检查setInterval()的东西。

现在我的代码是这样的:

function doIt(value){
  $.get("bunch/of/data.php", {param:value}, function(data){
    var t;
    var tt = 0;
    function process(){
      if(tt < 3000) {
        requestAnimationFrame(process)
      }
      var now = new Date().getTime();
      tt += (now - (t || now)); // + ms since last frame called
      t = now;
      //...do a bunch of stuff with data
      if(tt >= 3000){
        doIt(newValue)
      }
    }
    process();
  }
}

这会导致等待数据调用,然后使用它进行处理,然后等待下一次数据调用等。

1 个答案:

答案 0 :(得分:1)

显然没有经过测试,但我相信这段代码会起作用

使用jQuery AJAX调用返回promise的事实,这可以通过以下方式实现

feature2

使用ONLY jQuery的相同代码(即不需要在Internet爆炸中支持任何Promise)

var go = function go(initialValue) {
    return new Promise(function (resolve, reject) {
        var doIt = function doIt(value, data) {
            var p = void 0;
            if (value !== initialValue) {
                p = new Promise(function (resolve, reject) {
                    var started = 0;
                    function process(ms) {
                        started = started || ms;
                        var elapsed = ms - started;
                        var done = elapsed >= 3000;
                        if (done) {
                            return resolve();
                        }
                        // do stuff with data
                        requestAnimationFrame(process);
                    }
                    process(0);
                });
            } else {
                p = Promise.resolve();
            }
            if (value > 0) {
                $.ajax("bunch/of/data.php", { param: value })
                .then(function (data) {
                    return p.then(function () {
                        return doIt(value - 50000, data);
                    });
                });
            } else {
                resolve();
            }
        };
        doIt(initialValue);
    });
};
go(123593)
.then(function() {
    console.log('all done');
});