Асинхронный XMLHttpRequest не возвращает ответ, когда сопровождается кодом для перенаправления на другой URL в Firefox и Safari - PullRequest
0 голосов
/ 15 марта 2019

Я столкнулся с проблемой с моим кодом в 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 голосов
/ 15 марта 2019

Я бы предложил вам использовать обещание, сначала создайте функцию, которая запускает вызов 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 , показывающий, как работают обещания

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...