我正在尝试在while循环中发送xmlHttpRequest,并希望在同一个while循环中对响应执行某些操作。由于请求是异步的,我该如何实现呢?我需要连续执行所有内容
while(i < n){
response = self.sendHttpRequest(params);
//do something with the response
}
任何帮助将不胜感激。 即使我使用回调,如何在执行回调后返回同一个循环?
答案 0 :(得分:1)
您使用的是任何ajax库还是普通的js。如果您没有使用任何库,则可以将第三个参数传递给open方法false.like下面的
var xmlHttp=new xmlHttpRequest();
xmlHttp.open({YOUR_METHOD},{YOUR_PATH},false);
将false传递给open方法会进行同步调用。所以你可以在同一个循环中处理返回。
答案 1 :(得分:0)
我能想到两种方式:
1.在get调用之后添加一个轮询循环,直到设置了response.readyState,然后处理响应:
while(i < n){
response = self.sendHttpRequest(params);
while( response.readyState != 4 ){
// polling wait
}
//do something with the response
}
这个选项并不是真正推荐的,因为它会停止代码的流动,如果readyState永远不会改变,你可以在循环中停止(不太可能,但可能有错误)。
2.您可以将请求封装在一个函数中,该函数将在最后一个响应处理完成时以递归方式调用:
var i = 0;
function handle( response ){
//handle response
i++;
if( i < n ) sendRequest();
}
function sendRequest(){
// Your request setup code
response.onreadystatechange = handle;
response = self.sendHttpRequest(params);
}
在我看来,第二种方法是优选的,因为它保持了html请求调用的异步性,并且不会停止代码流,但是它确实“打破”了循环结构。第一种方法保留了循环结构,但编码实践不是很好。