2014-01-30 2 views
0

Есть ли способ выполнить несколько вызовов в определенном порядке с помощью jquery.when? первые клиенты, вторые смены, третьи Титулы и т.д.

$.when(
    service.doCall('GET', 'customers'), 
    service.doCall('GET', 'shifts'), 
    service.doCall('GET', 'params'), 
    service.doCall('GET','columns') 
).then(function(customers, shifts, params, columns) {} 

Каждый вызов возвращает отложенное обещание, которое не будет решена в результате вызова. Причина, по которой я хочу выполнить их в определенном порядке, заключается в том, что я показываю модальный, чтобы показать, какой вызов выполняется и какой вызов выполняется. В моем классе сервиса я уведомляю об использовании настраиваемого события, когда этот вызов выполняется. Например, когда клиенты загружаются:

loadingPopup.loadingCustomers.notify(); 

Затем в моем классе popup я слушаю эти события, как показано ниже. Но поскольку вызовы выполняются в случайном порядке, мои события запускаются в неправильном порядке.

me.loadingCustomers.attach(function() { 
    me.loadCustomersBusy(false); 
    me.loadCustomersDone(true); 
    me.loadShiftsBusy(true); 
}); 

me.loadingShifts.attach(function() { 
    me.loadShiftsBusy(false); 
    me.loadShiftsDone(true); 
    me.loadParamsBusy(true); 
}); 

me.loadParams.attach(function() { 
    me.loadParamsBusy(false); 
    me.loadParamsDone(true); 
    me.loadColumnsBusy(true); 
}); 
+0

, что вы подразумеваете под конкретный заказ –

+0

как после завершения клиентов, сдвига, то PARAMS, затем еще раз, когда PARAMS закончен послал столбцы запросить –

+0

@ArunPJohny редактировать – Stvenoo

ответ

1

Решение не использовать $.when, чтобы начать цепочку вызовов:

service.doCall('GET', 'customers').then(function() { 
    return service.doCall('GET', 'shifts') 
}).then(function() { 
    return service.doCall('GET', 'params') 
}).then(function() { 
    return service.doCall('GET','columns') 
}).then(...) 

Обратите внимание, что это не даст вам преимущество $.when автоматически который вызывается со всеми четырьмя результатами , поэтому, пока вы не должны использовать по номеру , вызовите звонки, вы можете использовать его для создания дополнительного обещания, что при разрешении будут переданы результаты все pre по-разному.

var def = []; 
def[0] = service.doCall('GET', 'customers'); 
def[1] = def[0].then(function() { return service.doCall('GET', 'shifts') }); 
def[2] = def[1].then(function() { return service.doCall('GET', 'params') }); 
def[3] = def[2].then(function() { return service.doCall('GET', 'columns') }); 

$.when.apply($, def).then(function(customers, shifts, params, columns) { 
    ... 
}); 

В этом случае я создаю массив объектов отсроченных, но каждый последующий вызов AJAX не запускается, пока предыдущая не закончил. Затем он использует $.when.apply($, def) для передачи всех четырех результатов отложенных объектов на окончательный обратный вызов.

+0

отсутствует 'return' перед' service.doCall', чтобы убедиться, что обратные вызовы возвращают обещания. Иначе правильное решение. –

+0

@ Да, да, я не приковал звонки правильно ... исправлю, спасибо. – Alnitak

+0

@ Алнитак хорошее решение, отлично работает. Благодаря! – Stvenoo

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