2015-11-08 7 views
0

Например мы в этот код:JQuery: вызов функции после асинхронной каждого

$.each([1, 2, 3], function(key, val) { 
    gear(val); 
}); 

function gear(params) { 
    var values = {1: 'abc', 2: 'cba', 3: 'acb'}; 
    query(values[params]); 
} 

function query(settings) { 
    $.ajax({ 
    ... 
    settings 
    ... 
    }) 
} 

Как я ждать, пока каждая итерация не будет завершена, и назвать что-то еще?

+1

Вы можете поместить ' $ .each' в функции и передать ему функцию обратного вызова и называть ее один раз, когда каждый из них превышает – Rajesh

ответ

2

Вы можете использовать .reduce() для перебора массива и JQuery Ajax обещает последовательность вызовов функций:

[1, 2, 3].reduce(function(p, item) { 
    return p.then(function() { 
     return gear(item); 
    }); 
}, $.Deferred().resolve()).then(function() { 
    // everything done here 
}); 

function gear(params) { 
    var values = {1: 'abc', 2: 'cba', 3: 'acb'}; 
    return query(values[params]); 
} 

function query(settings) { 
    return $.ajax({ 
    ... 
    settings 
    ... 
    }) 
} 

Это будет последовательно Аякс вызовов, так что следующий один Безразлично» t начинаться до тех пор, пока не будет выполнено предыдущее.

В обоих gear() и query() вы возвращаете обещание, что $.ajax() уже возвращается.

Затем вы используете .reduce() для повторения массива, в котором вы накапливаете обещание. Вы передаете первоначально разрешенное обещание, и затем каждый элемент из массива добавляет .then() в конец цепочки.


Если вы хотите запустить все Ajax звонки в то же время, а затем просто получить уведомление, когда они все сделали, вы могли бы сделать это:

$.when.apply($, [1, 2, 3].map(function(item) { 
    return gear(item); 
})).then(function(r1, r2, r3) { 
    // everything done here 
    // results are in arguments[0], arguments[1], ... arguments[n] 
}); 

function gear(params) { 
    var values = {1: 'abc', 2: 'cba', 3: 'acb'}; 
    return query(values[params]); 
} 

function query(settings) { 
    return $.ajax({ 
    ... 
    settings 
    ... 
    }) 
} 
+0

Трудно получить голову над отложенным, но, вероятно, самым умным методом. Я предпочитаю использовать .done/success для итерации, поскольку он легче на мозге :) – mplungjan

+0

@mplungjan - '.then()' является стандартом обещания ES6. jQuery уже поддерживает его, поэтому я использую стандартные, а не собственные методы jQuery. Отложенные/обещания - это метод управления и координации нескольких асинхронных операций. Может также начать изучать их сейчас. – jfriend00

+0

Спасибо, но на самом деле «трудно получить головы»: D Я пробовал использовать $ .when и $. Then, но без результатов, могу ли я использовать их здесь? –

-1

Ниже приведен пример его достижения.

function iterate(callback) { 
 

 
    $.each([1, 2, 3], function(key, val) { 
 
    gear(val); 
 
    }); 
 
    
 
    callback(); 
 
} 
 

 
function gear(params) { 
 
    var values = { 
 
    1: 'abc', 
 
    2: 'cba', 
 
    3: 'acb' 
 
    }; 
 
    print(values[params]); 
 
} 
 

 
function print(str) { 
 
    document.write(str + "<br />") 
 
} 
 

 
function notifyComplete(){ 
 
    print("Completed.") 
 
} 
 

 
iterate(notifyComplete);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>

+0

. Вы пропустите асинхронный режим и ПОЖАЛУЙСТА, не используйте document.write - используйте консоль или добавьте в какое-то сообщение div – mplungjan

+0

@ Rajesh, к сожалению, ваш Например, не async. –

0
var deferreds = []; 
$.each([1, 2, 3], function(key, val) { 
    gear(val); 
}); 

function gear(params) { 
    var values = {1: 'abc', 2: 'cba', 3: 'acb'}; 
    query(values[params]); 
} 

function query(settings) { 
    deferreds.push($.ajax({ 
    ... 
    settings 
    ... 
    })); 
} 
$.when.apply($, deferreds).done(function(){ 
    // do something here 
}); 
+0

Выполняет все вызовы ajax сразу, а не последовательно один за другим. ОП попросил подождать, пока одна итерация не была выполнена до начала следующего. – jfriend00

+0

«Как я могу дождаться завершения каждой итерации». Если бы я правильно понял вопрос, это именно то, что было задано. Вызовите функцию, когда все запросы ajax будут успешными. – sergeyz

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