如果我进行ajax调用,我可以添加成功处理.我想在我的自定义函数中添加类似的逻辑.
我有6-10个自定义函数,必须按顺序或独立运行.它们通常不是独立运行的,所以我现在通过调用前一个末尾的下一个函数来进行菊花链连接,但是读取时很麻烦,不允许单独执行.
我很想拥有这样的东西:
function runall(){
runfirst().success(
runsecond().success(
runthird()
))
}
我有其他情况我想将.success()处理添加到自定义函数,但这种情况使它更重要.
如果有另一种方法强制6-10个函数同步运行,这可以解决这个问题,但我也想知道如何将成功处理添加到我的自定义函数中.
我根据@lanzz的建议尝试了以下内容:
$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;
}
};
哪个没用.
最终解决方案
有关如何使用延迟的详细解释并使此工作见到这里:
Using Deferred in jQuery
最佳答案
如何使用Deferreds:
原文链接:https://www.f2er.com/jquery/428087.htmlfunction somethingAsynchronous() {
var deferred = new $.Deferred();
// now,delay the resolution of the deferred:
setTimeout(function() {
deferred.resolve('foobar');
},2000);
return deferred.promise();
}
somethingAsynchronous().then(function(result) {
// result is "foobar",as provided by deferred.resolve() in somethingAsynchronous()
alert('after somethingAsynchronous(): ' + result);
});
// or,you can also use $.when() to wait on multiple deferreds:
$.when(somethingAsynchronous(),$.ajax({ something })).then(function() {
alert('after BOTH somethingAsynchronous() and $.ajax()');
});
如果您的函数只是发出一个AJAX请求,您只需返回$.ajax()返回的实际承诺:
function doAjax() {
return $.ajax({ /* ajax options */ });
}
doAjax().then(function() {
alert('after doAjax()');
});