2012-06-05 2 views
3

Это первый раз, когда я использую $.when, и у меня возникают трудности с синтаксисом.
У меня есть код, похожий на упрощенный пример ниже. Он работает (если я не вызвал ошибку, когда я ее упростил). Моя проблема заключается в том, что я не знаю дома многих элементов, которые будут содержать массив customerIds.

var customerIds = new [1, 2, 3]; 

$.when(
    getCustomerData(customerIds[0]), 
    getCustomerData(customerIds[1]), 
    getCustomerData(customerIds[2]) 
).then(function() { 
    alert('success'); 
}).fail(function() { 
    alert('error'); 
}); 

function getCustomerData(int id) { 
    return new $.Deferred(function(defer) { 
        doSomeWork(id, defer); 
    }).promise();  
} 

Я хотел бы написать $.when заявление следующим образом, но имеющих трудности с получением права синтаксиса.

$.when(
    getCustomerDataCalls(customerIds), 
).then(function() { 
    alert('success'); 
}).fail(function() { 
    alert('error'); 
}); 

Где getCustomerDataCalls реализуется как:

function getCustomerDataCalls(customerIds) { 
    var dfds = []; 

    for (var id in customerIds) { 
     dfds.push(new $.Deferred(function(defer) { 
            doSomeWork(id, defer); 
           }).promise());  
    } 

    return dfds; 
} 

К сожалению, что-то не так с моей реализации, и я не могу работать, где я неправильно. Мое предположение, что что-то происходит не так, когда возвращающая массив Deferred s

Update:
Я обновил код после lanzz упомянул, что мой надуманный пример уже возвращает Отложенный, я обновил свой пример, чтобы включить doSomeWork

+1

Вам не нужно создавать новый экземпляр 'Deferred' для каждого' $ .get() 'вызов -' $ .get() 'уже возвращает обещание, вы можете использовать – lanzz

+0

' Var DFDS = новый [ ]; 'опечатка? – fcalderan

+0

@ Ф. Калдеран, действительно, спасибо, что исправил меня. –

ответ

15

Да, я тоже наткнулся на это: when нелегко позволить передать массив. Но вы можете использовать apply для достижения желаемого результата.

$.when.apply($, getCustomerDataCalls(customerIds)) 
+0

Мне кажется, что когда это поведение должно быть задано по умолчанию - то есть, если первый аргумент является массивом, а второй аргумент является функцией, тогда, когда все вещи в массиве завершены, вызовите функцию с массивом результатов. Как бы то ни было, когда это не очень полезно, поскольку, если вы заранее знаете, сколько отложенных звонков есть, вы можете легко написать код самостоятельно. – podperson

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