Как выйти из вложенного аякса - PullRequest
0 голосов
/ 21 июля 2009

У меня есть тесно связанный javascript, где есть ряд проверок if-else и многократные вызовы ajax. Ajax-вызовы имеют вложенный тип. Моя проблема в том, что я нахожусь в глубоко вложенной функции ajax, вызываемой и хочу изящно выбраться оттуда.

Фрагмент кода.

function showSubscriptionLightBox() {

$.get("/ajax/get_subscription_lightbox_content.php?feed_id=" + feedid, function(data) {

//Work on the data we receive... and check whether user is logged in.

if(userLoggedIn) {

//Make one more ajax call

$.get("/ajax/is_user_subscribed.php?feed_id=" + feedid, function(data) {

//Work on data again.... and check if user is subscribed.

if(userSubscribed) {

//Then there is popup which comes up, a part of same page and it has a button name "task".
document.getElementById('task').onclick = function() {

if(document.getElementById('email_mode').checked) {
$.ajax({
url : "ajax/is_user_email_verified.php?user_id="+userID,
success : function(data) {
  if(!data)
    return;

  var response;
    response = eval("response = " + data);

     if(!response)
         return;

     if(response['email_status'] == 0) {
        //Exit from here 
}}}

...... другая часть кода ..

Я хочу изящно выйти из JavaScript, когда ответ ['email_status'] == 0

Скажите, пожалуйста, как это сделать?

Я попробовал оператор return, но он перенес меня в функцию включения, а не вне скрипта.

Спасибо

Amit

Ответы [ 3 ]

0 голосов
/ 22 июля 2009

Я знаю, что с Prototype вы можете сделать это с помощью блоков try / catch. Вы можете выбросить объект изнутри одной из внутренних функций, и он будет перемещаться вверх по стеку вызовов для перехвата другими функциями.

0 голосов
/ 22 июля 2009

Для чего это стоит, вот код из одного из моих приложений. Он синхронизирует записи, используя JSONP и AJAX. Сначала он получает массив идентификаторов объектов с удаленного сервера. Затем он получает запись для идентификатора объекта с нулевым индексом с хост-сервера. Затем он отправляет полученную запись на удаленный сервер. В этот момент он продолжает процесс, запустив процесс с увеличенным индексом в массив идентификаторов. Он заканчивается, когда индекс достигает конца массива.

(function( $ ) {
    $.getJSON( 'http://remote.com/admin/record_ids.js?callback=?', function( data ) {
        var set_record = function( index ) {
            if ( index < data.length ) {
                $.get( 'record_get.json', { contact_id: data[ index ] }, function( data ) {
                    $.getJSON( 'http://remote.com/admin/record_save.js?callback=?', data, function() {
                        set_record( index + 1 );
                    });
                }, 'json');
            }
        };
        set_record( 0 );
    });
})( jQuery );

Как видите, когда вы хотите выйти изящно, вы просто не звоните. Я не могу представить, почему вы не можете просто вернуться, чтобы остановить свой код.

0 голосов
/ 21 июля 2009

Есть забавный трюк, который всегда можно использовать в JavaScript для выхода из стека вызовов: setTimeout () . Это полезно во многих ситуациях, не только в этом, оно также часто используется для обхода ошибок, связанных с событиями DOM, в браузерах.

$.ajax(
{
   url: 'lol.php',
   success: function(data)
   {
       setTimeOut(function()
       {
            // Your code comes here
       }, 0); // 0 will ensure that it gets executed immediately
   }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...