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

时间:2012-06-19 11:27:13

标签: javascript jquery ajax deferred

如果我进行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;
  }
};

哪个不起作用。

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

3 个答案:

答案 0 :(得分:4)

如何使用Deferreds

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()');
});

如果您的函数只是发出一个AJAX请求,您只需返回$.ajax()返回的实际承诺:

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

doAjax().then(function() {
    alert('after doAjax()');
});

答案 1 :(得分:0)

如果你的每个函数都返回一个状态/函数,然后你可能会为每个状态/函数添加一个原型,那么你就可以用流畅的api方式调用这样的函数(方法链接)。

runfirst().runSecond().runThird() 

等等。

Lemme尝试制作样本。

修改

See this,如果它符合您的设计

编辑2 我没有意识到,你在谈论异步方法链接。 有很好的例子here。在此stackoverflow thread

中对此进行了讨论

答案 2 :(得分:0)

据我所知,你真的只想要一种更好的方法来组织这些回调。您应该使用FIFO阵列或队列。你的所有运行应该为你堆叠,然后执行第一个功能。

var RunQueue = function(queue){
    this.init(queue);
}

var p = RunQueue.prototype = {};

p.queue = null;

p.init = function(queue){
    this.queue = queue.slice(); //copy the array we will be changing it
                                // if this is not practical, keep an index
}

p.run = function(){
    if(this.queue && this.queue.length) {
        var first = this.queue[0];
        this.queue.shift();
        var runQueue = this;
        first(function(){ /*success callback parameter*/
            runQueue.run();
        });
    }
}

用法:

var queue = [runFirst, runSecond, runThird, ...]

(new RunQueue(queue)).run();

如果你真的想要花哨,并且你可能需要,你可以传入包含你的参数的数组中的对象,并让RunQueue将最后一个参数附加为成功回调。您甚至可以传入上下文来运行该对象中的函数,然后在您的方法上调用apply或call(无论哪个使用数组)。

{
    method: runFirst,
    context: someObject,
    parameters: [param1, param2, param3];
}