2014-01-25 2 views
1

я хотел бы использовать, когда() для управления отделкой многократного AJAX вызовов, такие как:

$.when(
    $.ajax("test.aspx"), 
    $.ajax("test2.aspx"), 
    ... 
).then(...); 

Наконец, я хотел бы использовать $ .when с результатами вызовов функций из переменного массива. Я не понимаю, как это сделать.

Как мы можем исправить следующую конструкцию? Проблема неверна, потому что мы передаем массив объектов Function, но не результат вызовов функций.

funcArray = [ 
    function() { return $.ajax("test.aspx") }, 
    function() { return $.ajax("test2.aspx") } 
] 

if(cond) 
{ 
    funcArray.push(function() { return $.ajax("test3.aspx") }) 
} 

$.when.apply(null, funcArray).then(...); // how to correct here and probably somewhere else? 
+1

Ваши функции должны возвращать результат '$ .ajax()': 'функция() {вернуть $ .ajax (" test.aspx ")}' – ComFreek

+0

@ComFreek Я полагаю, что это хорошая коррекция, но это не решение, не так ли? – sergzach

+0

'$ .when' принимает обещания как свои аргументы, а не * функции, возвращающие обещания *. Сначала вам нужно вызвать все ваши функции, сохранить возвращенные обещания в массиве и передать * этот * массив в '$ .when' (используя' apply'). –

ответ

2

Как Маттиас Buelens уже сказал в a comment, проблема заключается в том, что вы передаете функции, возвращающие обещания $.when – не фактические обещания.

Вы должны выполнить итерацию массива и вернуть результат каждого вызова функции.

Есть несколько способов сделать это:

  • [Наиболее стабильным] Использование $.map функции JQuery в:

    $.when.apply(null, $.map(funcArray, function (val) { 
        return val(); 
        }) 
    ); 
    
  • Использование Array.prototype.map():

    $.when.apply(null, funcArray.map(function (val) { 
        return val(); 
        }) 
    ); 
    
  • Firefox ≥ 22 также позволяет так называемый синтаксис arrow functions:

    $.when.apply(null, funcArray.map(fun => fun())); 
    
+2

Если проблема совместимости является проблемой, вы можете также использовать '' $ .map (array, func) '] (http://api.jquery.com/jQuery.map/) для замены' array.map (func) '. –

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