链接 $.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
});
我需要获取资源 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
});