我需要以同步方式链接一些异步函数(因为每个请求都会计算服务器端的结果,并且此结果会根据请求的顺序而改变):
let updateQueue = new $.Deferred();
let dict = {
"A": "A1",
"B": "B1",
"C": "C1",
"D": "D1",
"E": "E1",
}
let show = function(x) {
console.log(x);
/* Here comes the async part (AJAX)
$.ajax();
*/
}
for(let prop in dict) {
updateQueue.then(function() { show(dict[prop]); });
}
updateQueue.resolve();
输出正如我所期望的那样:见https://jsfiddle.net/oheaejcu/7/
但是当我在for循环中添加updateQueue
时,我不知道延迟对象.then()
的行为。
输出是否正确,因为每个函数的调用顺序与它们排队的顺序相同?
输出是否正确,因为函数show
很短,但在调用resolve()
的同时被多次调用了?
基本上,在调用updateQueue.then(func1)
时,是否将func1附加到updateQueue
或updateQueue
解析的最后一个承诺?
答案 0 :(得分:0)
在致电
updateQueue.then(func1)
时,是否将func1
附加到updateQueue
是。 show
函数可能会按照它们附加的顺序调用,但是当您调用resolve()
并且不等待彼此的异步部分时,它们都被调用。
或由
updateQueue
解决的最后一个承诺?
没有。您的代码中只有一个承诺。要获得链中的最后一个承诺,您需要记住然后在变量中返回.then(…)
调用的值:
let updateQueue = Promise.resolve(); // jQuery.Deferred().resolve().promise, if you insist
for (let prop in dict) {
updateQueue = updateQueue.then(function() { return show(dict[prop]); });
// ^^^^^^^^^^^^^ ^^^^^^
}
updateQueue.then(function() { console.log("all done"); });