2013-06-26 3 views
3

В моем Javascript App (JQuery) У меня есть два события, которые асинхронносинхронизация два асинхронных событий в JavaScript

  • виджет 1 пожары «Event1», когда загрузится
  • виджет 2 пожаров «EVENT2», когда заканчивается loading

Как «синхронизировать» эти два события асинхронизации, чтобы «вызвать метод» только после этих двух событий.

Мне нужен подход, который также работает для нескольких событий.

+3

Использовать функцию обратного вызова? –

ответ

12

Используйте отсроченные объекты.

var deferredObj1 = $.Deferred(), 
    deferredObj2 = $.Deferred(); 

$.when(deferredObj1,deferredObj2).done(function(){ 
    console.log("They are both done!"); 
}); 

// inside the Event1 handler: 
deferredObj1.resolve(); 

// inside the Event2 handler: 
deferredObj2.resolve(); 
+0

+1 избили меня, просто напомнил себе, как это работает. Просто добавьте As of JQuery 1.5 'ajax' вызовы реализуют интерфейс' Promise', предполагая, что асинхронные события, о которых идет речь, являются 'ajax', это должно быть именно то, что ваш после ... – Liam

+0

Спасибо. Элегантный путь. Копаем в документы, прямо сейчас – catalinux

1

Возможно, вы захотите посмотреть на async.js, который обеспечивает очень интересный и чистый способ синхронизации выполнения асинхронных действий.

Например, метод waterfall позволяет осуществлять асинхронные операции в последовательном порядке.

Такое исполнение выглядит довольно просто и в вашей реальной жизни код:

async.waterfall([ 
    function(callback){ 
     callback(null, 'one', 'two'); 
    }, 
    function(arg1, arg2, callback){ 
     callback(null, 'three'); 
    }, 
    function(arg1, callback){ 
     // arg1 now equals 'three' 
     callback(null, 'done'); 
    } 
], function (err, result) { 
    // result now equals 'done'  
}); 
+2

Водопад выглядит действительно как jquery $ .when или я неправильно понял его цель –

+1

Это фактически цепочки вызовов, так что второй работает после первого, третьего после второго и т. Д. Это может быть или не быть желательным, в зависимости от обстоятельств , Первоначальный код запускал обе задачи одновременно и мог работать в любом порядке. – cHao

+1

@cHao уверен, в этом случае ничто не мешает вам использовать 'async.parrallel', если вы хотите, чтобы ваши действия выполнялись в parrallel. –