对话框弹出窗口和微调器的行为不正确

时间:2014-09-26 13:47:15

标签: javascript jquery ajax

我想弹出/显示一个对话框。它有两个标签,每个标签中都有一个表格(比如说 table1 table2 )。

这两个表都包含由rest / ajax服务填充的数据(假设 service1 service2 )。

当每个休息服务完成时,表组件将填充数据。

除此之外,对话框首次弹出对话框时会激活一个微调器窗口小部件。

当其他服务的 BOTH 完成时,微调器窗口小部件将被停用。

对于 table1 ,我的代码看起来有点像这样:

this.updateTable1 = function (dialog)
{
    dialog.setSpinner(true)

    var call = {}
    call.url = 'service1';
    call.xmlHttpReq = $.ajax({
        url: url,
        dataType: 'json',
        async: true,
        type: 'GET'
    }).always(
       function (processedDataOrXHRWrapper, textStatus, xhrWrapperOrErrorThrown) 
       {
         dialog.table1.loadData(processedDataOrXHRWrapper);
         dialog.setSpinner(false)
       });
};

对于 table2 ,代码几乎相同。

这意味着它还有 dialog.setLoading(false)。这意味着无论哪个进程首先完成,微调器都会被停用,这是不正确的行为。

不知何故,两个ajax调用需要彼此了解,但我不喜欢这个想法:(。我应该有某种第三个对象来存储已完成哪些进程的状态?

我尝试在同步模式下使用ajax调用,但这只会阻止浏览器中的显示线程。

1 个答案:

答案 0 :(得分:1)

您可以使用Deferred promises来实现此目的。

var updateTable1 = function (dialog)
{
    return $.ajax({
        url: url,
        dataType: 'json',
        async: true,
        type: 'GET'
    }).always(
       function (processedDataOrXHRWrapper, textStatus, xhrWrapperOrErrorThrown) 
       {
         dialog.table1.loadData(processedDataOrXHRWrapper);)
       });
};
// and same for updateTable2 

dialog.setSpinner(true);
$.when(updateTable1(dialog), updateTable2(dialog)).always(function() {
               dialog.setSpinner(false);
});

只有上述问题是,如果updateTable1updateTable2中的ajax调用失败,则会立即调用always函数。如果您不想这样 - 请参阅此问题答案中的$.whenall函数: jquery deferred - "always" called at the first reject