2013-05-27 3 views
0

Я хочу выполнить вызов ajax и предотвратить код после его завершения до тех пор, пока не завершится вызов ajax.Запретить запуск кода до тех пор, пока не завершится ajax

Скажем, у меня есть этот код

.on('pageloadfailed', function(event){ 

    //if I move event.preventDefault to here the popup doesn't show. But I only want 
    //to prevent the default bahaviour if the condition in the ajaxe response if met. 

    $.when(ajax1()).done(function(response){ 
     if(resposne.success == true){ 
      event.preventDefault(); 
     } 
    }); 

    function ajax1() { 
     return $.ajax({ 
      url: "someUrl", 
      dataType: "json", 
      data: yourJsonData,    
      ... 
     }); 
    } 

    alert("test"); 

} 

Оповещение будет срабатывать всегда, я только хочу, чтобы стрелять, если код внутри «когда» метод не возвращает ложь.

Спасибо за ответы, я пойду в дело немного дальше.

Я использую jquery mobile. И когда ошибка загрузки страницы jqm отображает всплывающее окно, в котором пользователь обновляет. Однако в некоторых случаях я не хочу, чтобы это произошло, я действительно хочу сам обработать ошибку.

Так что, когда событие pageloadfailed уволено, я не должен был что-то проверять с помощью ajax. В некоторых случаях я буду справляться с тем, что происходит, но в других, которые я просто хочу продолжить.

Предупреждение на самом деле не существует в моем коде, который я просто пытался использовать для иллюстрации этой точки.

+0

Вы нашли адекватный ответ на свой вопрос? Если это так, отметьте его как принятый ответ – enyce12

ответ

-1

Я бы использовал функцию $ .when().

$.when(ajaxFunction()).done(function(response){ 
    if(response.text != "false"){ 
     alert("test"); 
    } 
}) 

function ajaxFunction() { 
    return $.ajax({ 
     url: "someUrl", 
     dataType: "json", 
     data: dataInJson,    
    }); 
} 

в коде выше я использовал response.text, но это предположение - я не помню, как именно ответ структуры выглядеть, вы должны проверить это самостоятельно. Все, что я знаю, это то, что он состоит из 3 параметров, и один из них - текст ответа.

+0

, пожалуйста, ознакомьтесь с моими изменениями к исходному сообщению. Спасибо –

+0

$ .when асинхронная функция, и она не будет запускаться последовательно в вашем .on ('pageloadfailed'). Событие будет закончено долго до того, как событие event.preventDefault() будет тригером. –

+0

Есть ли способ предотвратитьDefault перед тем, когда и затем «повторно включить» его внутри условия? –

2

просто положить атрибуции async в false

из JQuery ajax:

асинхронным (по умолчанию: правда)

Тип: Boolean

По умолчанию все запросы отсылаются асинхронно (т.е. по умолчанию установлено значение true). Если вам нужны синхронные запросы, установите для этого параметра значение false.

+1

'Начиная с jQuery 1.8, использование async: false с jqXHR ($ .Deferred) устарело' – enyce12

2

Используйте success и error обратных вызовов:

$.ajax({ 
     url: "someUrl", 
     dataType: "json", 
     data: yourJsonData, 
     success: function() { 
      doSomethingOnSuccess(); 
     }, 
     error: function() { 
      doSomethingOnError(); 
     } 
    }) 
0

Если выглядит, как вы почти там:

function ajax1() { 
    return $.ajax({ 
     url: "someUrl", 
     dataType: "json", 
     data: yourJsonData,    
     ... 
    }); 
} 

$.when(ajax1()).done(function(){ 
    alert("this should run when your AJAX call is completed. Put your code here"); 
}); 
Смежные вопросы