我在不同的js代码部分中有5个不同的ajax请求,只有一个处理程序:
ajaxRequest1
ajaxRequest2
ajaxRequest3
ajaxRequest4
ajaxRequest5
handler
我想达到以下顺序:
如果我调用ajaxRequest1,我应该处理它,并且只有在它之后我才能发出下一个ajaxRequest。
例如它是很好的排序:
start ajaxRequest1
start handler
start ajaxRequest2
start handler
start ajaxRequest3
start handler
start ajaxRequest4
start handler
start ajaxRequest5
start handler
但这很糟糕:
start ajaxRequest1
start ajaxRequest2
start ajaxRequest3
start handler
start handler
start ajaxRequest4
start handler
start handler
start ajaxRequest5
start handler
javascript是否允许实现它?
答案 0 :(得分:1)
如果我理解正确,你想在运行之前等待一些条件成为现实。如果是这样,可以使用setTimeout
循环完成此操作。
function waitFor(fnReady, fnCallback) {
var check = function() {
if (fnReady()) {
fnCallback();
}
else {
setTimeout(check, 100); // wait another 100ms, and try again
}
};
check();
}
var result = 0;
function ajaxRequest1() {
$.ajax(...).done(
function() { result++; }
);
}
function ajaxRequest2() {
$.ajax(...).done(
function() { result++; }
);
}
waitFor(function() { return result === 1; }, ajaxRequest2);
waitFor(function() { return result === 2; }, ajaxRequest3);
答案 1 :(得分:0)
听起来像Deferreds的工作。如果你正在使用jQuery,这样的事情应该做你想要的:
function ajaxRequest1() {
var dfd = $.Deferred();
$.ajax(...)
.done(function(response) {
if (/*response is valid*/)
dfd.resolve(response);
else
dfd.reject();
});
.fail(function() {
dfd.reject();
});
return dfd.promise();
}
function ajaxRequest2(response1) {
// similar to ajaxRequest1, but with different URL, params
}
function ajaxRequest3(response2) {
// similar to ajaxRequest2, but with different URL, params
}
// Run the tasks sequentially
$.when(ajaxRequest1())
.then(ajaxRequest2)
.then(ajaxRequest3)
.done(function(result1, result2, result3) {
// all requests have completed
})
.fail(function() {
// handle error
});
这里,每个ajaxRequestX函数也是处理程序。它检查从前一个请求收到的响应,如果一切正常,它将启动下一个请求。查看jQuery的Deferred对象以获取更多信息。