我不确定如何标题,希望它不会太混乱。我有一段js代码,它在对象列表上执行管道操作。它必须按顺序执行一系列ajax请求,并返回结果。这是一些非常简化的代码
var urls = [
{ url: "http://myurl.com/1", expected: "one" },
{ url: "http://myurl.com/2", expected: "two" }
];
$(document).on("click", "#runselftest", function () {
for (var u in urls) {
values.push(u);
dfdNext = dfdNext.pipe(function () {
return testUrl(values.shift());
});
}
dfd.resolve();
});
testUrl = function (i) {
return $.ajax({
url: urls[i].url,
dataType: "json"
}).done(function (result) {
if (result.result == urls[i].expected) {
// yay
}
else {
// aww
}
}).fail(function () {
// this is causing the problem
});
};
我希望我的操作即使在ajax中的失败条件下也能继续处理。但是,如果我return $.ajax
并且第一次操作失败,则管道停止。如果我不 return $.ajax
,而是在.always
中返回延迟的承诺,则ops异步发生。我希望它们按顺序同步发生。第二个操作系统必须等待第一个操作才能完成。
我是否需要重写代码或是否有简单的解决方案?
答案 0 :(得分:1)
最好使用包装器延迟对象
testUrl = function (i) {
var d = $.Deferred();
$.ajax({
url: urls[i].url,
dataType: "json",
success: function(){
d.resolve();
},
error: function(){
d.reject();
}
});
return d.promise();
};
你可以像这样使用它
var deferred = test();
deferred.always(function(){
//you can pout your coce
});
答案 1 :(得分:0)
var promise1 = return $.ajax();
var promise2 = return $.ajax();
$.when(promise1, promise2).done(function(p1, p2) {
//this will pipe them in order. If one fails it should move to the next, you just won't get any data from the failed promise
});
答案 2 :(得分:0)
这是您想要的最低要求:
testUrl = function (i) {
var d = $.Deferred();
$.ajax({
url: urls[i].url,
dataType: "json"
}).always(function(){
d.resolve();
});
return d.promise();
};