我有一组异步函数发出executeSql命令来删除2个表,并有回调来创建2个表并填充2个表。
我想知道他们什么时候完成。
我不介意他们是否同步执行。事实上,我更喜欢他们同步运行!
问:我是否会使用jQuery管道方法对这些函数进行排队,以便它们以比传递回调更传统的方式执行?
我想做类似的事情:
DropTableA();
CreateTableA();
PopulateTableA();
DropTableB();
CreateTableB();
PopulateTableB();
window.location.replace('Index.htm');
答案 0 :(得分:1)
如果它们都是同步函数(在这些函数中没有异步调用),则可以确保在所有函数之后调用window.location.replace('Index.htm');
。如果你进行ajax通话,你可以做
jQuery.ajaxSetup( {async: false});
befare调用第一个函数,你没事,因为你的所有AJAX调用现在都是同步的
答案 1 :(得分:1)
如果您的功能是同步的,只需按照正确的顺序调用它们,就像您在示例中所做的那样。
假设你的函数返回一个promise()
或一个可观察的对象,你可以简单地做
$.when(fn1(), fn2(), ... ).done(function() {
/* here you know that all functions have been returned, as you asked */
})
(请注意,您不仅可以将deferred
个对象用于异步任务)
编辑:如果订单很重要,您可以使用此插件:
jQuery.whenSync() Plugin For Chaining Asynchronous Callbacks Using Deferred Objects
答案 2 :(得分:1)
这是jQuery延迟/承诺发挥作用的地方。基本上你修改你的功能
function myAction1() {
var dfd = $.Deferred();
$(selector).whatever(function() { dfd.resolve(); // this is one of the callbacks});
return dfd.promise();
}
然后你可以“等待”使用像
这样的结构完成所有操作$.when(myAction1(), myAction2(), ...).then(function() {
// this will be executed when all the actions finished = resolved
}
答案 3 :(得分:1)
看一下jQuery的Deferreds and Promises。
简而言之,这是一个异步执行某些异步函数的例子(在本例中为setTimeout)。在调用该函数时,您将获得一个承诺。
var myFunc = function (value) {
var d = $.Deferred();
setTimeout(function () {
d.resolve(42 * value);
}, 1000);
return d.promise();
};
var promise = myFunc(100);
promise.done(function (res) { console.log(res); });
当所有promieses都已完成时,你可以使用$ .when执行某些事情,即
$.when(p1, p2, p3).then(...)
如果您想执行它们,您可以使用deffered's pipe链接延迟。