Когда все мои функции завершены? - PullRequest
1 голос
/ 08 февраля 2012

У меня есть набор асинхронных функций, которые выдают команды executeSql для удаления 2 таблиц, и имеют обратные вызовы для создания 2 таблиц и заполнения 2 таблиц.

Я бы хотел знать, когда они ВСЕ завершат.

Я бы не возражал, если бы они выполнялись синхронно. На самом деле, я бы предпочел, чтобы они работали синхронно!

В: Я бы использовал метод канала jQuery, чтобы поставить в очередь эти функции, чтобы они выполнялись более традиционным способом, чем выдача обратных вызовов?

Я хочу сделать что-то вроде:

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

Ответы [ 4 ]

1 голос
/ 08 февраля 2012

Посмотрите на jQuery Отложенные и обещанные .

Вкратце, вот пример асинхронной функции, которая выполняет что-то асинхронно (в данном случае 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); });

Вы можете использовать $ .when для выполнения чего-либо, когда все обещания были выполнены, т.е.

$.when(p1, p2, p3).then(...)

Если вы хотите выполнить их по порядку, вы можете связать отложенные звенья, используя трубу отложенных .

1 голос
/ 08 февраля 2012

Если ваши функции синхронны, просто вызывайте их в правильном порядке, как вы это делали в своем примере.

Предполагая вместо этого, что ваша функция возвращает promise() или наблюдаемый объект, который вы можете просто сделать

$.when(fn1(), fn2(), ... ).done(function() {
   /* here you know that all functions have been returned, as you asked */
})

(обратите внимание, что deferred объекты можно использовать не только для асинхронных задач)

Редактировать: если порядок важен, вы можете использовать этот плагин:
Плагин jQuery.whenSync () для объединения асинхронных обратных вызовов с использованием отложенных объектов

1 голос
/ 08 февраля 2012

Здесь jQuery deferred / обещает вступить в игру. В основном вы изменяете свои функции следующим образом

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
}
1 голос
/ 08 февраля 2012

Если все они являются синхронными функциями (без асинхронного вызова внутри этих функций), вы уверены, что window.location.replace('Index.htm'); вызывается после всех из них. Если вы делаете вызов ajax, вы можете сделать

 jQuery.ajaxSetup( {async: false});

befare, вызывающая первую функцию, и вы в порядке, потому что все ваши вызовы AJAX теперь синхронны

http://jsfiddle.net/ywL63/

...