嘿。我需要一些jQuery Ajax调用的帮助。在javascript中,我必须对控制器进行ajax调用,该控制器从模型中检索一个值。然后我检查返回的值并在必要时进行进一步的ajax调用,比如如果值达到特定阈值,我可以停止ajax调用。
这需要一个接一个地进行处理的ajax调用。我尝试使用async:false
,但它冻结了浏览器,我在前端进行的任何jQuery更改都没有反映出来。有没有办法解决这个问题?
提前致谢。
答案 0 :(得分:5)
你应该在第一个完成后调用下一个ajax调用,例如:
function getResult(value) {
$.ajax({
url: 'server/url',
data: { value: value },
success: function(data) {
getResult(data.newValue);
}
});
}
答案 1 :(得分:1)
在success
回调函数中,如有必要,只需提出另一个$.ajax
请求。 (设置async: false
会导致浏览器将请求作为与其他所有内容相同的线程运行;这就是它冻结的原因。)
答案 2 :(得分:1)
使用回调函数,有两个:success
和error
。
来自jQuery ajax
页面:
$.ajax({
url: "test.html",
context: document.body,
success: function(){
// Do processing, call function for next ajax
}
});
一个(非常)简化的例子:
function doAjax() {
// get url and parameters
var myurl = /* somethingsomething */;
$.ajax({
url: myurl,
context: document.body,
success: function(data){
if(data < threshold) {
doAjax();
}
}
});
}
答案 3 :(得分:1)
尝试使用$.when()(1.5以后可用),您可以拥有一个回调,一旦所有调用都会触发,它更干净,更优雅。最终看起来像这样:
$.when($.ajax("/page1.php"), $.ajax("/page2.php")).done(function(a1, a2){
// a1 and a2 are arguments resolved for the page1 and page2 ajax requests, respectively
var jqXHR = a1[2]; /* arguments are [ "success", statusText, jqXHR ] */
alert( jqXHR.responseText )
});
答案 4 :(得分:1)
我使用了一系列步骤和回调函数来继续执行async启动的地方。适合我。
var tasks = [];
for(i=0;i<20;i++){
tasks.push(i); //can be replaced with list of steps, url and so on
}
var current = 0;
function doAjax(callback) {
//check to make sure there are more requests to make
if (current < tasks.length -1 ) {
var uploadURL ="http://localhost/someSequentialToDo";
//and
var myData = tasks[current];
current++;
//make the AJAX request with the given data
$.ajax({
type: 'GET',
url : uploadURL,
data: {index: current},
dataType : 'json',
success : function (serverResponse) {
doAjax(callback);
}
});
}
else
{
callback();
console.log("this is end");
}
}
function sth(){
var datum = Date();
doAjax( function(){
console.log(datum); //displays time when ajax started
console.log(Date()); //when ajax finished
});
}
console.log("start");
sth();