2012-02-08 1 views
1

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

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

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

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

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

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

Как вы их называете из javascript? AJAX для сервера? – yoozer8

+0

, если вы ставите в очередь функции, тогда вы не используете их асинхронно.Если вы действительно хотите запустить их асинхронно, вам понадобится обратный вызов, чтобы узнать, когда они закончат или используют технологию Tech Thread, как описано здесь http://stackoverflow.com/questions/929606/join-2-threads-in-javascript –

ответ

1

Посмотрите на JQuery-х Deferreds and Promises.

Вкратце, вот пример функции async, выполняющей что-то асинхронно (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 выполнить что-то, когда все promieses были выполнены, т.е.

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

Если вы хотите, чтобы выполнить их в порядке, вы можете приковать deferreds с помощью deffered's pipe.

+0

еще нет заказа для вызова функций .. – jAndy

+0

@jAndy адрес, с трубой. – ggozad

+0

Как-то ответ всегда имеет отношение к 42, не так ли? Во всяком случае, давайте предположим, что я хотел использовать трубу, потому что это новая жара. Я бы сделал: $ .pipe (DropTableA(), CreateTableA(), PopulateTableA(), DropTableB(), CreateTableB(), PopulateTableB())? –

1

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

jQuery.ajaxSetup({async: false}); 

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

http://jsfiddle.net/ywL63/

+1

«У меня есть набор асинхронных функций» (...) – jAndy

+0

Каждый из них выполняет executeSql –

+0

@jAndy жаль, что я пропустил это! Он заявил, что «я бы не возражал, если они выполнялись синхронно», чтобы он мог сделать так: я предложил и установил async в false –

1

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

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

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

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

Edit: если вопросы заказа вы можете использовать этот плагин:
jQuery.whenSync() Plugin For Chaining Asynchronous Callbacks Using Deferred Objects

+0

, которая не будет гарантировать порядок в любом случае – jAndy

+0

Я только что ответил на вопрос «I 'd хотел бы знать, когда они ВСЕ закончили. "в любом случае он может использовать также' pipe() 'для привязки отложенных – fcalderan

+0

Так что я мог бы сделать $ .when (DropTableA(), DropTableB()). done (function() { }); а затем функции drop table будут иметь обратные вызовы для создания функций таблицы, а функции create table будут иметь обратные вызовы для функций PopulateTable. –

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 
} 
+0

, это не гарантирует порядок вызовов функций. Для выполнения заказа нужно вызвать '.pipe()'. – jAndy

+0

ОК, главный вопрос заключался в том, чтобы выяснить, «когда они ВСЕ выполнены». И это то, что отсрочка/обещание достигнет – devnull69

+0

, возможно, это был вопрос, но это не остановит ваш мозг. Не так много смысла «PopulationTableA» перед «DropTableA». – jAndy

 Смежные вопросы

  • Нет связанных вопросов^_^