2013-05-13 2 views
0

A JS контроль вызывает службу передачи данных и продолжает рендеринг самостоятельно, не дожидаясь результата. Иногда служба возвращается после того, как элементы управления полностью отображаются, иногда - раньше. Как вы применяете WaitForAll в JS? Я использую jQuery.Wait For All шаблон синхронизации в Javascript

Вот что я сделал сам: (Utils.WaitForAll просто подсчитывает количество обращений, как только это согласуется с графом она называет ручкой)

// before we started 
var waiter = Utils.WaitFor({handle: function(e){ alert("got called"; }, count: 2}); 

, как он сработал:

// place one 
waiter.Notify({one: {...}}); 

, а затем

// place two (can occur before one though) 
waiter.Notify({two: {...}}); 

, который триггеры, ручка имеет значения, помеченные как one & two в своем e. Официант является дополнительным «глобальным» var, путешествующим по стеку, который мне не очень нравится, и это еще один новый объект в конце концов ... Любые очевидные проблемы с моим подходом?

+0

Скорее всего, услуга передачи данных имеет функцию обратного вызова рода, который говорит вам, когда это будет сделано. вам нужно будет использовать его. –

+0

Действительно, я просто ищу пример шаблона синхронизации ... – user1514042

+0

Вы не можете сделать это, не делая синхронный сервис данных, что, вероятно, [плохая идея] (http://stackoverflow.com/questions/ 6517403/что-есть-The-недостатки-оф-использование-синхронный Ajax-вызов). –

ответ

3

Вы должны взглянуть на интерфейс обещаний CommonJS (реализованный jQuery.Deferred), он обеспечивает прогресс callback, который может быть использован в этом случае.

Пример кода:

var waiter = $.Deferred(); 
var len = 2; 
waiter.done(function() { 
    alert("Hooray!!!"); 
}); 
waiter.progress(function() { 
    if(--len === 0) { 
     waiter.resolve(); 
    } 
}); 
// somewhere 
$.ajax({ 
    ... 
    data: somedata, 
    success: function() { 
     waiter.notify(); 
    } 
}); 
// somewhere else 
$.ajax({ 
    ... 
    data: someotherdata, 
    success: function() { 
     waiter.notify(); 
    } 
}); 

Подробнее о отложила:

+0

Это правильный путь. Чтобы уточнить, 'Deferred.when' может использоваться для ожидания нескольких объектов обещания для решения (т. Е. Для завершения нескольких параллельных операций).Вы можете использовать конструктор 'Deferred', чтобы сделать объект обещания из любого кода, чтобы он« разрешал », когда вызывается его обратный вызов. – harpo

+0

Не могли бы вы объяснить, как обновляется len - это не совсем ясно из кода. – user1514042

+0

@ user1514042 Извините, я не добавил никакой логики для декрементизации 'len' ранее. Я обновил свой ответ. надеюсь, теперь вам ясно. –