2013-10-01 152 views
1

我有两个ajax调用不能在一个调用中完成。当第一个Ajax调用开始时,第二个Ajax调用可以立即开始,或者当用户按下发送按钮时。如果第二个Ajax调用开始,他必须等待第一个Ajax调用的响应,因为他需要来自它的数据。Ajax呼叫等待另一个Ajax呼叫的响应?

如何才能实现第二个Ajax调用只有在第一个Ajax调用的响应到达后才发送他的请求?

  • 是否有另一种方法比setTimeout?
  • 我可以以某种方式在ajax调用1上注册ajax调用2的监听器吗?

我的代码是:

var xhrUploadComplete = false; 

// ajax call 1 
$.ajax({ 
url: url, 
type: "POST", 
data: formdata, 
processData: false, 
contentType: false, 
complete: function(response) { 
    var returnedResponse = JSON.parse(response.responseText); 
    xhrUploadComplete = true; 
} 
}); 

// ajax call 2 
if (xhrUploadComplete) { 
    $.ajax({ 
    url: url2, 
    type: "POST", 
    data: formdata2, 
    processData: false, 
    contentType: false, 
    complete: function(response) { 
    ... 
    } 
    }); 
} 

编辑:第二个AJAX调用不能在第一次调用的()完成或完成()上公布,因为这取决于用户的选择来发送最终形式。这两步过程的目的是在用户将其插入输入类型=文件后,将图像发送到服务器。

编辑:在知道我不能的if(..),因为这是一个异步调用。我写了它来明确我需要做什么。我想我需要Java中的未来。

+1

难道你不是已经注册了第一个Ajax调用的结果的监听器吗?请告诉我们你的代码。 – Bergi

+0

@Bergi我发布了代码 – confile

+0

“如果第二个Ajax调用启动,他必须等待第一个Ajax的响应=>这没有任何意义,如果它必须等待,那么它不能启动... – Christophe

回答

5

xhrUploadComplete将被设置为true异步(在未来,当请求已完成),所以您的if -condition(即评估的请求启动后右)将永远不会实现。你不能简单地return (or set) a value from an ajax call。相反,移动是等待结果到处理程序会设置代码/返回的变量:

$.ajax({ 
    url: url, 
    type: "POST", 
    data: formdata, 
    processData: false, 
    contentType: false, 
    complete: function(response) { 
     var returnedResponse = JSON.parse(response.responseText); 
     $.ajax({ 
      url: url2, 
      type: "POST", 
      data: formdata2, 
      processData: false, 
      contentType: false, 
      complete: function(response) { 
       … 
      } 
     }); 
    } 
}); 

随着无极模式,你甚至可以更优雅的撰写者:

$.ajax({ 
    url: url, 
    type: "POST", 
    data: formdata, 
    processData: false, 
    contentType: false 
}).then(function(response) { 
    var returnedResponse = JSON.parse(response.responseText); 
    return $.ajax({ 
     url: url2, 
     type: "POST", 
     data: formdata2, 
     processData: false, 
     contentType: false 
    }); 
}).done(function(response) { 
    // result of the last request 
    … 
}, function(error) { 
    // either of them failed 
}); 

也许你需要也需要这个:

var ajax1 = $.ajax({ 
    url: url, … 
}).then(function(response) { 
    return JSON.parse(response.responseText); 
}); 
$(user).on("decision", function(e) { // whatever :-) 
    // as soon as ajax1 will be or has already finished 
    ajax1.then(function(response1) { 
     // schedule ajax2 
     return $.ajax({ 
      url: url2, … 
     }) 
    }).done(function(response) { 
     // result of the last request 
     … 
    }, function(error) { 
     // either of them failed 
    }); 
}); 
+0

我无法在done()或complete()中完成第二个Ajax请求,因为用户决定何时发送最终表单。查看我的问题的更新。 – confile

+0

然后从用户的决策处理程序中添加它的火焰?使用承诺模式(请参阅我的编辑),您可以通过调用'then' /'done'来访问该值,而不管它现在或将来是否可用。 – Bergi

+0

这不是我所需要的,因为当第二个Ajax调用启动时,用户必须决定点击事件。第二个呼叫只在第一个呼叫完成后才开始,但只有在用户点击之后才会启动。 – confile