Если я делаю вызов ajax, я могу добавить обработку успеха. Я хочу добавить аналогичную логику в свои пользовательские функции.
У меня есть 6-10 пользовательских функций, которые ДОЛЖНЫ выполняться последовательно или независимо друг от друга. Обычно они не работают независимо друг от друга, поэтому теперь я связал их последовательно, вызывая следующую функцию в конце предыдущей, но это неудобно для чтения и не позволяет выполнять отдельное выполнение.
Я хотел бы иметь что-то вроде этого:
function runall(){
runfirst().success(
runsecond().success(
runthird()
))
}
У меня были другие ситуации, когда я хотел бы добавить обработку .success()
к пользовательской функции, но эта ситуация сделала ее более важной.
Если есть другой способ заставить 6-10 функций выполняться синхронно, это могло бы решить эту проблему, но я также хотел бы знать, как добавить обработку успеха в свои пользовательские функции.
Я добавил .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 и выполнить эту работу, см. здесь:
Использование Deferred в jQuery