jQuery $ .when执行命令

时间:2014-01-30 09:29:13

标签: jquery jquery-deferred

有没有办法使用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) {}

每次调用都会返回一个延迟的promise,并使用调用的结果解析。 我想以特定顺序执行它们的原因是因为我显示了一个模式来显示正在执行哪个调用以及执行哪个调用。在我的服务类中,我在调用完成后使用自定义事件通知。例如,当客户加载时:

loadingPopup.loadingCustomers.notify();

然后在我的弹出类中,我会听到这些事件,如下所示。但由于调用是以随机顺序执行的,因此我的事件会以错误的顺序触发。

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);
});

1 个答案:

答案 0 :(得分: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的好处,然后会自动调用所有四个结果,因此您不应该使用$.when启动调用时,您可以使用它来创建一个额外的承诺,在解决后将传递所有之前调用的结果。

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)将所有四个延迟对象结果传递给最终回调。