2013-07-02 3 views
0

У меня есть клиентское веб-приложение, которое при загрузке немедленно вызывает вызов конечной точки api, чтобы узнать, аутентифицирован ли пользователь. Если нет, отображается материал для входа. если пользователь аутентифицирован, отображается другая информация.Как дождаться запроса jquery, чтобы вернуть ответ?

Я не хочу ничего показывать, пока эта информация не будет возвращена. Мой первоначальный подход состоял в том, чтобы использовать синхронный вызов, который кажется правильным. Но, основываясь на ответах на этот вопрос, кажется, что это неправильный подход:

Synchronous JSON cross-domain?

Если это так, то мне нужно сделать асинхронный, а затем остановить, пока данные не будут возвращены. Функция

Я использую нокаут, чтобы сделать вызов в Activate(), как это:

var activate = function() { 
    // get auth data 
    authPayload(dataservice.getAuthPayload()); 
    if (!authPayload().isAuthenticated) { 
     // do stuff 
    } else if (authPayload().isAuthenticated === true){ 
     // do other stuff 
    } 

С getAuthPayload:

var getAuthPayload = function() { 
     var options = { 
      async: false, 
      url: apiEndpoint + 'api/authpayload', 
      type: 'GET', 
      dataType: 'json' 
     }; 
     return $.ajax(options) 
      .then(querySucceeded) 
      .fail(queryFailed); 
}; 

В настоящее время это работает синхронно, хотя, так что функция activate не видит каких-либо данных ответа, так как он не дожидается, когда он вернется с сервера. приложение в настоящее время показывает счетчик, пока функция activate не закроется. Как подождать по телефону до dataservice.getAuthPayload()?

ответ

0

Я считаю, что вопрос вы возвращаете $ .ajax сразу вместо того, чтобы использовать функцию .done, это работает для меня:

var go = $.ajax({ 
     type: 'POST', 
     data: {fof: 'bar'} 
    }) 
    .done(function(results) { 
     // Code here won't execute until response received from AJAX 
    }) 
    .fail(function(msg) { 
     console.debug('Error:'); 
     console.debug(msg); 
    }) 
    .always(function() { 
    }); 
+0

Просто чтобы прояснить, что происходит, Аякс команда возвращает обещание, которое имеет методы, такие как done(), fail() и always(), которые принимают функции обратного вызова. Затем переданные функции вызываются, когда задача async завершается успешно или не выполняется. – Soviut

Смежные вопросы