【发布时间】:2015-06-19 05:00:45
【问题描述】:
我正在使用 $.when 和 .done 来确保在保存数据后关闭窗口。但是,这似乎没有按预期工作。
工作流程是,用户点击“保存并关闭”按钮,首先保存数据,触发打印并关闭窗口。但是保存数据和关闭窗口同时发生,导致打印失败。
我已经阅读了 when..then 和 deferred object。尝试在下面的代码中实现它,有时它可以工作,但大多数时候它会中断。
$("#btnSaveAndClose").click(function (event) {
$.when(zSaveSomeData()).done(function (value) {
zCloseMyWindow();
});
});
function zSaveSomeData() {
return zSaveMasterData(masterdata, function () {
return zSaveDetailData();
});
};
function zSaveMasterData(masterdata, fnAfterSave) {
return $.ajax({
type: 'POST',
contentType: 'application/json',
url: '/api/masterdata/',
data: JSON.stringify(masterdata),
success: function (data) {
fnAfterSave();
}
});
};
function zSaveDetailData() {
var selectedDataGroups;
// some logic here
zSaveDetails(selectedDataGroups);
};
function zSaveDetails(selectedDataGroups) {
var deferred = $.Deferred();
$.ajax({
type: 'POST',
contentType: 'application/json',
url: '/api/detaildata/',
data: JSON.stringify(selectedDataGroups),
success: function (data) {
var printableGroupIDs = [];
$.each(data, function () {
if (this.IsPrintable)
printableGroupIDs.push(this.ID);
});
if (printableGroupIDs.length > 0) {
zPrintGroups(printableGroupIDs);
}
deferred.resolve('done');
}
});
zAuditSave();
return deferred.promise();
};
function zPrintGroups(newGroupIDs) {
// calls external program to print groups
};
function zCloseWindow() {
window.close();
};
function zAuditSave() {
$.ajax({
type: 'POST',
contentType: 'application/json',
url: '/api/audit'
success: function (data) {
}
});
};
唯一的问题是保存调用内部的其他方法来获取相同的主数据和详细数据。也有几个 ajax 调用。一个不寻常的事情是,在数据保存后,有一个调用 VB 代码实际上触发了一个 Print。我很困惑为什么要在执行其他方法之前关闭窗口。任何帮助将不胜感激。
【问题讨论】:
-
return zSaveDetailData(); zCleanUp();- 等等什么? -
什么是
zAuditSave()? -
@Bergi,感谢您指出这一点,实际上该代码是我编辑时遗留下来的。它不在那里。我添加了返回测试,但确实清理了代码。
-
zAuditSave()是另一种调用 webApi 来审核保存的方法。我也会添加那个方法。
标签: javascript jquery jquery-deferred .when