链接 $.ajax() 用于 Q 的同步请求不起作用

Chaining $.ajax() for synchronous requests with Q doesn't work

我需要获取资源 A,然后是 B,等等,直到 n。我按照官方指南 https://github.com/kriskowal/q#sequences .

按照以下方式进行了此操作
var chain = Q();
            for(var i=0;i<x.length;i++){
            chain = chain.then( $.ajax({
                        type: "POST",
                        url : data_url,
                        data:pdata
                }) );
return chain;   

.then() 处理程序接受函数引用作为参数,而不是承诺。您的代码正在立即执行您的 ajax 调用,然后将返回的承诺传递给无效的 .then() 处理程序。

如果您希望 Ajax 调用稍后按顺序执行,则需要将它们放在这样的函数中,以便您可以将该函数引用传递给 .then()。这样,promise 基础设施就可以在将来的某个时间调用您的函数:

var chain = Q();
for (var i = 0; i < x.length; i++) {
    chain = chain.then(function(priorResults) {
        return $.ajax({
            type: "POST",
            url: data_url,
            data: pdata
        });
    });
}
return chain;

您将函数引用传递给 .then() 处理程序,以便 promise 基础结构可以在稍后的某个时间执行该函数。

如您所见,$.ajax() 调用全部立即执行,只有链接的承诺。

如果您试图在 .then() 处理程序中使用 i 变量,那将无法正常工作,因为 for 循环将结束并且 i 将在调用 .then() 处理程序时具有其终值。通常的解决方案是在 ES6 中使用 let 作为 for 循环变量,使用类似 .forEach() 的东西进行迭代,或者确保 for 循环包含一个 function/closure 可以唯一地捕获 i 变量的每个单独值。如果您展示了您的实际代码,可以提供更多详细信息。


P.S。我认为您的问题中缺少一些代码,因为您可能不想每次都执行完全相同的 Ajax 调用。

如果您正在迭代数组,那么使用 promises 串行迭代数组的常见设计模式是 .reduce(),如下所示:

array.reduce(function(p, item) {
    return p.then(function(priorResult) {
        return $.ajax(...);
    });
}, Q()).then(function(result) {
    // everything done here, final result
});