#ajax
#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 resu<
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.Расположение.href = «index.php?module=login amp; method =logout»;
Однако я не получаю никакого ответа от сделанного мной запроса, если за ним следует перенаправление в FireFox. Это отлично работает в Chrome, но не в Firefox, и характерно для случая, когда за запросом следует перенаправление. У меня нет контроля над кодом перенаправления, который нужно изменить. Есть ли способ принудить браузер сначала выполнить запрос и получить ответ перед перенаправлением, сохраняя при этом асинхронность вызова.
Ответ №1:
Я бы посоветовал вам использовать обещание, сначала создайте функцию, которая запускает вызов ajax, который возвращает ответ с вашего сервера:
ajax_AuthUser(id,pass){
return $.ajax({
method: "POST",
url: "authUser.php",
data: { id: id, pass: pass}
})
}
Во-вторых, используйте оператор done:
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, который показывает, как работают обещания
Надеюсь, это поможет