2013-04-29 2 views
0

У меня есть следующие данныеПродолжить цикл после завершения функции. Как использовать JQuery deffered

var data = [{user:"somename"}, {user:"anothername"}]; 

У меня есть эта функция, которая обрабатывает то что, скажем проверки пользователя, если он существует

function process(user) { 
    $.ajax({ 
     url: 'http://domain.com/api', 
     success: function(result) { 
      if(result == 'success') 
       anotherFunction(); 
      else 
       console.log('error'); 
     } 
    }) 
} 

function anotherFunction() { 
    $.ajax({ 

     // do stuffs 
    }) 
} 

$ .each (данные, функции (K, V) { процесс (v.user); })

$.each будет пытаться петли даже process и anotherFunction не finishe d yet

Вопрос: что я могу сделать, чтобы гарантировать, что все функции закончены, прежде чем переходить к другому индексу?

Я слышал, что могу использовать jquery отложенные.

+0

так в чем ваш реальный вопрос? – Alnitak

+0

в порядке. Я очищу все. вне. мой вопрос в том, как продолжить цикл после завершения всех процессов .. –

+0

@JoeySalacHipolito Пока неясно, чего вы хотите. Вы хотите, чтобы 'process()' возвращался после того, как все было сделано, а не сразу? – zeroflagL

ответ

1

Соберите обещания, возвращаемые вашей функции AJAX, при необходимости постобработки, в результате с .then так, что он называет anotherFunction(), которые также должны return результатом $.ajax.

function process() { 
    return $.ajax(...).then(function(result) { 
     if (result === 'success') { 
      return anotherFunction(); 
     } else { 
      return null; // this might need to change... 
     } 
    }); 
} 

function anotherFunction() { 
    return $.ajax(...); 
} 

var promises = []; 
$.each(data, function(k, v) { 
    promises.push(process(v.data)); 
} 

, а затем ждать, пока все обещает быть решен:

$.when.apply($, promises).done(function() { 
     // all done here 
}); 

NB: в общем это хорошая практика для вызова AJAX для создания нон 2xx код возврата ошибок, а не код ошибки в «успешном» HTTP-вызове. Затем это позволяет коду на стороне клиента использовать обычную обработку ошибок AJAX (т. Е. .fail callbacks) вместо проверки на наличие ошибок в обработке успешного AJAX.

+0

Я попробую это. –

+0

Я обновил свой вопрос. –

+0

В принципе, что говорит Алнимак, но в этом вопросе (как изначально дано) происходит всевозможная цепочка/рекурсивная аякс, поэтому 'process()' нужно построить, чтобы вернуть обещание конечного результата *, созданный довольно сложной цепочкой .then(). Нет времени, чтобы написать сейчас .... –

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