如果我进行 ajax 调用,我可以添加成功处理。我想为我的自定义函数添加类似的逻辑。
我有 6-10 个必须按顺序或独立运行的自定义函数。它们通常不会独立运行,因此我现在通过在前一个函数的末尾调用下一个函数将它们以菊花链形式连接起来,但这读起来很麻烦,并且不允许单独执行。
我很想拥有这样的东西:
function runall(){
runfirst().success(
runsecond().success(
runthird()
))
}
我有过其他情况,我想为.success()
自定义函数添加处理,但这种情况使它变得更加重要。
如果有另一种方法可以强制 6-10 个函数同步运行,那可以解决这个问题,但我也想知道如何将成功处理添加到我的自定义函数中。
我根据@lanzz 的建议尝试了以下方法:
我添加.then()
到我的功能:
$bomImport.updateGridRow(rowId).then(function () {
$bomImport.toggleSubGrid(rowId, false);
});
var $bomImport = {
updateGridRow: function (rowId) {
$('#' + rowId + ' td[aria-describedby="bomImport_rev"]').html($("#mxRevTxt").val());
$('#' + rowId + ' td[aria-describedby="bomImport_itemno"]').html($("#itemNoTxt").val());
$('#' + rowId + ' td[aria-describedby="bomImport_used"]').html($("#usedTxt").val());
$('#' + rowId + ' td[aria-describedby="bomImport_partSource"]').html($("#partSourceTxt").val());
$('#' + rowId + ' td[aria-describedby="bomImport_partClass"]').html($("#partClassTxt").val());
$('#' + rowId + ' td[aria-describedby="bomImport_partType"]').html($("#partTypeTxt").val());
$('#' + rowId + ' td[aria-describedby="bomImport_partno"]').html($("#mxPnTxt").val());
$('#' + rowId + ' td[aria-describedby="bomImport_descript"]').html($("#descTxt").val());
$('#' + rowId + ' td[aria-describedby="bomImport_qty"]').html($("#qtyTxt").val());
$('#' + rowId + ' td[aria-describedby="bomImport_custPartNo"]').html($("#custPartNoTxt").val());
$('#' + rowId + ' td[aria-describedby="bomImport_crev"]').html($("#custRevTxt").val());
$('#' + rowId + ' td[aria-describedby="bomImport_u_of_m"]').html($("#uomTxt").val());
$('#' + rowId + ' td[aria-describedby="bomImport_warehouse"]').html($("#warehouseTxt").val());
$('#' + rowId + ' td[aria-describedby="bomImport_standardCost"]').html($("#stdCostTxt").val());
$('#' + rowId + ' td[aria-describedby="bomImport_workCenter"]').html($("#wcTxt").val());
var defferred = new $.Deferred();
return defferred.promise();
}};
代码正确地转到 updateGridRow 的末尾,没有给出错误,但永远不会返回调用第二个函数。
我还按照@Anand 的建议尝试了以下操作:
workSheetSaveExit(rowId, isNew).save().updateRow().toggle();
function workSheetSaveExit(){
this.queue = new Queue;
var self = this;
self.queue.flush(this);
}
workSheetSaveExit.prototype = {
save: function () {
this.queue.add(function (self) {
$bomImport.workSheetSave(rowId, isNew);
});
return this;
},
updateRow: function () {
this.queue.add(function (self) {
$bomImport.updateGridRow(rowId);
});
return this;
},
toggle: function () {
this.queue.add(function (self) {
$bomImport.toggleSubGrid(rowId, false);
});
return this;
}
};
这没有用。
最终解决方案
有关如何使用 deferred 并使其工作的详细说明,请参见此处:
在 jQuery 中使用 Deferred