jQuery在解析之前延迟链接then()

时间:2018-03-14 07:44:12

标签: javascript jquery

我需要以同步方式链接一些异步函数(因为每个请求都会计算服务器端的结果,并且此结果会根据请求的顺序而改变):

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附加到updateQueueupdateQueue解析的最后一个承诺?

1 个答案:

答案 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"); });