使用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文件,因此需要按顺序加载。因此,在启动第二次提取之前,第一个必须完成,否则依赖性将失败
答案 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
来电。
更正版本:
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;