异步XMLHttpRequest在跟随代码重定向到Firefox和Safari中的另一个URL时未返回响应

时间:2019-03-15 16:16:46

标签: ajax

我在FireFox和Safari中遇到如下代码问题:

xhr = new window['XMLHttpRequest'];
xhr.onreadystatechange = function() {
if (done || xhr.readyState != 4) {
return;
}
done = true;
handleResponse(xhr.responseText, callback);
};
}
xhr.open('GET', uri+params, true);
xhr.withCredentials = true; 
xhr.send(null);

function handleResponse(responseText, callback) {
var error;
var result;
try {
result = toucan.JSON.parse(responseText)['result']; //connectedAuth 
logout result.
} catch (ex) {
result = undefined;
}
console.log("Result is" + result);

if (!result) {
var errorCode = 'UnknownError';
var errorMessage = 'An unknown error ocurred';
error = toucan.Base.format('%s: %s', errorCode, errorMessage);
}
invokeCallback(error, callback);

}

这之后是重定向为:window.location.href =“ index.php?module = login&method = logout”;

但是,如果在FireFox中进行重定向后,我收到的请求没有任何响应。 这在Chrome浏览器中工作正常,但在Firefox中却不行,并且特定于请求后跟重定向的情况。 我无法控制要更改的重定向代码。有没有一种方法可以强制浏览器先完成请求并获得响应,然后再进行重定向,同时保持调用异步。

1 个答案:

答案 0 :(得分:0)

我建议您使用Promise,首先创建一个运行ajax调用的函数,该函数从您的服务器返回响应:

    ajax_AuthUser(id,pass){

      return   $.ajax({
        method: "POST",
        url: "authUser.php",
        data: { id: id, pass: pass}
      })

    }

第二次使用完成的语句:

ajax_AuthUser(id,pass)
.done(function(response){
     //check the response here !! maybe  validate the json ?
      var auth = JSON.parse(response)
      if(auth.response == "approved"){
     //do something here
        }else{
     //do other stuff here
             }
          }).fail(function(response){
          //do something if fail
}).always(function(){
 //do something after the call finished
})

如果您想要一个真实的例子,这里有一个jsfiddle,显示了诺言如何工作

希望有帮助