我的所有功能什么时候完成?

时间:2012-02-08 16:05:46

标签: javascript jquery asynchronous jquery-deferred

我有一组异步函数发出executeSql命令来删除2个表,并有回调来创建2个表并填充2个表。

我想知道他们什么时候完成。

我不介意他们是否同步执行。事实上,我更喜欢他们同步运行!

问:我是否会使用jQuery管道方法对这些函数进行排队,以便它们以比传递回调更传统的方式执行?

我想做类似的事情:

DropTableA();
CreateTableA();
PopulateTableA();
DropTableB();
CreateTableB();
PopulateTableB();
window.location.replace('Index.htm');

4 个答案:

答案 0 :(得分:1)

如果它们都是同步函数(在这些函数中没有异步调用),则可以确保在所有函数之后调用window.location.replace('Index.htm');。如果你进行ajax通话,你可以做

 jQuery.ajaxSetup( {async: false});

befare调用第一个函数,你没事,因为你的所有AJAX调用现在都是同步的

http://jsfiddle.net/ywL63/

答案 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链接延迟。