多个 jQuery 承诺按顺序
Multiple jQuery promises in sequential order
基本上我想要这个:
function do_ajax_calls(...){
var d = $.Deferred();
$.ajax(args).done(function(){
$.ajax(args).done(function(){
$.ajax(args).done(function(){
d.resolve();
});
});
})
return d.promise();
}
但是 ajax 调用的次数取决于我传递给函数的参数,它是一个数组,所以我不能使用那个代码。
该函数应该 return 一个仅在最后 ajax 调用完成时才解析的承诺。所以函数需要这样调用:
do_ajax_calls(....).done(function(){
// here is the callback
})
有人知道我该怎么做吗?
在这儿Demo
var counter = 1 ;
function multipleAjax(loop)
{
if(counter<loop)
{
$.ajax(
{
url: 'http://mouadhhsoumi.tk/echo.php',
success:function(data)
{
multipleAjax(loop);
$(".yo").append(data+"</br>");
counter++;
}
});
}
}
multipleAjax(5);
promise 之所以重要的原因之一是因为它们可以被链接起来。您可以利用此优势将其他请求迭代链接到前一个请求的解决方案:
function do_ajax_calls() {
var dfd = $.Deferred();
var promise = dfd.promise();
var responses = [];
function chainRequest(url) {
promise = promise.then(function (response) {
responses.push(response);
return $.ajax(url, { method: 'POST' });
});
}
for (var i = 0, length = arguments.length; i < length; i++) {
chainRequest(arguments[i]);
}
dfd.resolve();
return promise.then(function (response) {
return responses.slice(1).concat(response);
});
}
以上代码将 return 最终解析为所有响应的数组的承诺。如果任何一个请求失败,承诺将拒绝第一次失败。
But the number of ajax calls depends on the arguments that I pass to the function, which is an array
如果每个数组项 ajax 调用一次
function do_ajax_calls(args) {
return args.reduce(function(promise, item) {
return promise.then(function() {
return $.ajax(args); // should that be item?
});
}, Promise.resolve(true));
}
Promise.resolve(true)
是一个 "native" 承诺,即在 IE 中不可用,但我确定 jQuery 有一个等效的
这是一个JSFiddle演示
尝试使用 $.when()
、Function.prototype.apply()
、$.map()
function do_ajax_calls(args) {
return $.when.apply($, $.map(args, function(request, i) {
return $.ajax(request) // `request` : item with `args` array
}))
}
do_ajax_calls
.then(function success() {
console.log(arguments)
}, function err() {
console.log("err", arguments)
});
基本上我想要这个:
function do_ajax_calls(...){
var d = $.Deferred();
$.ajax(args).done(function(){
$.ajax(args).done(function(){
$.ajax(args).done(function(){
d.resolve();
});
});
})
return d.promise();
}
但是 ajax 调用的次数取决于我传递给函数的参数,它是一个数组,所以我不能使用那个代码。
该函数应该 return 一个仅在最后 ajax 调用完成时才解析的承诺。所以函数需要这样调用:
do_ajax_calls(....).done(function(){
// here is the callback
})
有人知道我该怎么做吗?
在这儿Demo
var counter = 1 ;
function multipleAjax(loop)
{
if(counter<loop)
{
$.ajax(
{
url: 'http://mouadhhsoumi.tk/echo.php',
success:function(data)
{
multipleAjax(loop);
$(".yo").append(data+"</br>");
counter++;
}
});
}
}
multipleAjax(5);
promise 之所以重要的原因之一是因为它们可以被链接起来。您可以利用此优势将其他请求迭代链接到前一个请求的解决方案:
function do_ajax_calls() {
var dfd = $.Deferred();
var promise = dfd.promise();
var responses = [];
function chainRequest(url) {
promise = promise.then(function (response) {
responses.push(response);
return $.ajax(url, { method: 'POST' });
});
}
for (var i = 0, length = arguments.length; i < length; i++) {
chainRequest(arguments[i]);
}
dfd.resolve();
return promise.then(function (response) {
return responses.slice(1).concat(response);
});
}
以上代码将 return 最终解析为所有响应的数组的承诺。如果任何一个请求失败,承诺将拒绝第一次失败。
But the number of ajax calls depends on the arguments that I pass to the function, which is an array
如果每个数组项 ajax 调用一次
function do_ajax_calls(args) {
return args.reduce(function(promise, item) {
return promise.then(function() {
return $.ajax(args); // should that be item?
});
}, Promise.resolve(true));
}
Promise.resolve(true)
是一个 "native" 承诺,即在 IE 中不可用,但我确定 jQuery 有一个等效的
这是一个JSFiddle演示
尝试使用 $.when()
、Function.prototype.apply()
、$.map()
function do_ajax_calls(args) {
return $.when.apply($, $.map(args, function(request, i) {
return $.ajax(request) // `request` : item with `args` array
}))
}
do_ajax_calls
.then(function success() {
console.log(arguments)
}, function err() {
console.log("err", arguments)
});