我想弹出/显示一个对话框。它有两个标签,每个标签中都有一个表格(比如说 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调用,但这只会阻止浏览器中的显示线程。
答案 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);
});
只有上述问题是,如果updateTable1
或updateTable2
中的ajax调用失败,则会立即调用always
函数。如果您不想这样 - 请参阅此问题答案中的$.whenall
函数:
jquery deferred - "always" called at the first reject