Javascript 按顺序排列的多个jQuery承诺
基本上我想要这个:Javascript 按顺序排列的多个jQuery承诺,javascript,jquery,promise,jquery-deferred,Javascript,Jquery,Promise,Jquery Deferred,基本上我想要这个: 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调用的
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调用的数量取决于我传递给函数的参数,函数是一个数组,因此我不能使用该代码
该函数应返回一个承诺,该承诺仅在最后一次ajax调用完成时解析。因此,需要像这样调用函数:
do_ajax_calls(....).done(function(){
// here is the callback
})
有人知道我怎么做吗?给你
var计数器=1;
函数multipleAjax(循环)
{
如果(counter承诺之所以重要的原因之一是因为它们可以链接。您可以利用这一优势,将其他请求迭代链接到前一个请求的解决方案上:
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);
});
}
函数do\u ajax\u调用(){
var dfd=$.Deferred();
var promise=dfd.promise();
var响应=[];
函数链接请求(url){
承诺=承诺。然后(功能(响应){
响应。推送(响应);
返回$.ajax(url,{method:'POST'});
});
}
for(var i=0,length=arguments.length;i
上面的代码将返回一个最终解析为所有响应数组的承诺。如果任何一个请求失败,该承诺将在第一次失败时拒绝
但是ajax调用的数量取决于我传递给函数(数组)的参数
如果是每个数组项一个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)
是一个“本机”承诺,即在IE中不可用,但我确信jQuery有一个等价的承诺
下面是一个演示尝试使用$.when()
,函数.prototype.apply()
,$.map()
我认为,通过某种评估,我可以传递以前构建的字符串,但我不确定这是否是最好的方法。这看起来不起作用。循环中的那些ajax调用都会立即触发?很抱歉,我吹毛求疵,但我认为这也不起作用,因为url变量在内部函数中。我认为它会e未定义。我知道,因为我经历过这个问题。你有一个观点,尽管变量不是未定义的。我这里有一个愚蠢的竞争条件,我无法在小提琴中看到,因为我每次发送相同的URL。我再次修复了它。这个答案违背了承诺的观点,即链接和可组合性。这没有区别租金比使用纯粹的回调要高。
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));
}
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)
});