如果我进行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;
}
};
哪个不起作用。
最终解决方案
有关如何使用延迟的详细解释并使此工作见到这里:
Using Deferred in jQuery
答案 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 :(得分: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];
}