如何正确链接ajax调用?

时间:2017-04-01 20:04:16

标签: javascript jquery ajax promise bluebird

使用jQuery 3.2.1我将这样的调用链接到$ .ajax:

function get(i) {
    return $.ajax(...)
      .done(function() { console.log('get done: ' + i) })
      .fail(function() { console.log('get failed: ' + i) })
}

var p = Promise.resolve();
for (var i = 0; i < len; i++) {
    p = p.then(get(i));
}

p.done(function() { console.log('Finished') });

我希望在i = 0的调用解决后,i = 1的ajax调用才会执行。同样,最后的done()应该等待按顺序执行所有调用

实际上我在看到“完成”之前看到其他任何内容并且“完成”以随机顺序返回(第一个完成后首先回来是我的猜测)。

我已经习惯了Bluebird,这可行。我做错了什么?

*附录I *

添加到上面,我正在加载具有依赖关系的javascript文件,因此需要按顺序加载。因此,在启动第二次提取之前,第一个必须完成,否则依赖性将失败

1 个答案:

答案 0 :(得分:1)

有两个问题:

  • get 函数立即执行,而then方法应获取对该函数的引用,以便以后由Promise实现执行。所以替换:

    p = p.then(get(i));
    

    使用:

    p = p.then(get.bind(null,i));
    
  • JavaScript的本机承诺不会公开done方法,因此请替换:

    p.done(function() { console.log('Finished') });
    

    使用:

    p.then(function() { console.log('Finished') });
    

您可能还应该在最终承诺中添加catch来电。

更正版本:

&#13;
&#13;
function get(i) {
    return $.ajax('https://jsonplaceholder.typicode.com/posts/'+(i+1))
      .done(function() { console.log('get done: ' + i) })
      .fail(function(err) { console.log('get failed: ' + i) })
}

var len = 4;
var p = Promise.resolve();
for (var i = 0; i < len; i++) {
    p = p.then(get.bind(null,i));
}

p.then(function() { console.log('Finished') })
 .catch(function () { console.log('Error occurred') });
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
&#13;
&#13;
&#13;