自定义javascript函数中的成功处理

dav*_*ids 5 javascript ajax jquery deferred

如果我进行ajax调用,我可以添加成功处理.我想在我的自定义函数中添加类似的逻辑.

我有6-10个自定义函数,必须按顺序或独立运行.它们通常不是独立运行的,所以我现在通过调用前一个末尾的下一个函数来进行菊花链连接,但是读取时很麻烦,不允许单独执行.

我很想拥有这样的东西:

function runall(){
    runfirst().success(
        runsecond().success(
            runthird()
    ))
} 
Run Code Online (Sandbox Code Playgroud)

我还有其他情况,我想.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();
}};
Run Code Online (Sandbox Code Playgroud)

代码正确地进入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;
  }
};
Run Code Online (Sandbox Code Playgroud)

哪个没用.

最终解决方案
有关如何使用延迟的详细解释并使这项工作见到这里: 在jQuery中使用Deferred

lan*_*nzz 5

如何使用延迟

function 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()');
});
Run Code Online (Sandbox Code Playgroud)

如果你的函数只是发出一个 AJAX 请求,你可以只返回由 返回的实际承诺$.ajax()

function doAjax() {
    return $.ajax({ /* ajax options */ });
}

doAjax().then(function() {
    alert('after doAjax()');
});
Run Code Online (Sandbox Code Playgroud)