Потерянное соединение не возвращает ошибку с JQuery AJAX на живом сайте, но на dev? - PullRequest
1 голос
/ 16 ноября 2010

Я использую следующий код для отправки данных с сайта asp.net 2.0 на веб-сервис asp.net 2.0, который отправляет данные на сервер:

$.ajax({
    type: "POST",
    url: "SynchroniseCustomers.asmx/synchroniseCustomers",
    data: JSON.stringify(customerObj),
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    error: function (xhr, status) {
        // If not successfull
    },
    success: function (msg) {
        deleteCustomer(customer.id);
    }
});

У меня есть функция JavaScript, чтобы проверить, есть ли у меня соединение или нет, если у меня есть, я запускаю синхронизацию (получение данных из локальной базы данных браузера веб-набора):

function checkConnection() {
    var i = new Image();
    i.onload = synchronise;
    i.onerror = fail;
    i.src = 'http://myurl.com/ping.gif?d=' + escape(Date());
    setTimeout("checkConnection()", 60000); // Execute every minute
}

Дело в том, что если я запускаю это локально и теряю подключение к Интернету, веб-служба возвращает ошибку 500 (как я этого хочу) и deleteCustomer (customer.id); не называется. Тем не менее, на живом сайте, если я разрываю соединение, веб-служба не возвращает ошибку и deleteCustomer (customer.id); вызывается, даже если у меня нет подключения к Интернету (клиент удаляется из локальной базы данных без публикации на веб-сервере).

В чем причина? Пожалуйста, дайте мне знать, если вам нужно больше кода.

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 16 ноября 2010

В некоторых случаях Ajax вызывает кешированные данные, когда вас просят удалить, и даже если вы не подключены к сети, он получает их из кэша, поэтому он считает, что все в порядке.Кеш в jQuery Ajax по умолчанию имеет значение true.

Поэтому попробуйте использовать cache: false

$.ajax({
    type: "POST",
    url: "SynchroniseCustomers.asmx/synchroniseCustomers",
    data: JSON.stringify(customerObj),
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    cache:false,

    error: function (xhr, status) {
        // If not successfull
    },
    success: function (msg) {
        deleteCustomer(customer.id);
    }
});

Для вызова изображения лучше использовать Interval, а не создаватьпамять снова и снова.

<img id="PingerImg" width="1" height="1" src="/spacer.gif?" onload="synchronise" onerror="fail" /> 

<script language="javascript" type="text/javascript">
    var myImg = document.getElementById("PingerImg");

    if (myImg){
        window.setInterval(function(){myImg.src = myImg.src.replace(/\?.*$/, '?' + Math.random());}, 60000);
    }   
</script>

Обновление

Другое решение - действительно получить код подтверждения с сервера, на котором вы удалили пользователя, и только если вы читаете этот код, продолжайтеудалить пользователя на пульте.

    success: function (msg) {
        if(msg.confirm = true)
        {
         deleteCustomer(customer.id);
        }
        else
        {
         alert('Fail to delete user.');
        }
    }
0 голосов
/ 16 ноября 2010

Вы, вероятно, не подождали минуту после разрыва соединения.

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