Есть ли название для этого шаблона? - PullRequest
5 голосов
/ 11 октября 2010

Я практически уверен, что этот шаблон должен существовать и иметь имя ... сейчас я назову его "шаблон ворот" ...

Вот он:

В javascript моей веб-страницы я должен запускать различные асинхронные процессы.Давайте не будем обсуждать, насколько полностью асинхронными являются js, но в любом случае я должен инициировать 2 или 3 вызова AJAX, должен быть уверен, что создание пользовательского интерфейса завершено и т. Д.

Только тогда, когда все эти процессызакончил, я хочу выполнить определенную функцию.И точно один раз.

Пример

1: cropStore loaded()
2: resizeEvent()
3: productStore loaded()

Шаблон: В конце каждого (успешного) Ajax-load-callback, конец процедуры построения GUIи т. д. Я установил соответствующий флаг с false на true и вызову gatedAction ()

onEvent( 'load',
{
   ....  // whatever has to happen in response to cropStored, resized, etc...
   // lastly:
   f1 = true; //resp f2, f3, ...
   gatedAction();
}

Gate проверит флаги, вернет, если какой-либо флаг еще не установлен, только вызовет целевую функцию, если всефлаги (или как я их называю: ворота) открыты.Если все мои асинхронные предварительные условия вызывают gatedAction () ровно один раз, надеюсь, я могу быть уверен, фактическая целевая функция вызывается ровно один раз ().

gatedAction ()
{
   // Gate
   if ( ! f1) return;
   if ( ! f2) return;
   if ( ! f3) return;

   // actual Action ( <=> f1==f2==f3==true )
   targetFunction();
}

На практике это работает надежно.С другой стороны: я думаю, что java-типичные (не js-типичные) проблемы синхронизации / энергозависимости могут быть проигнорированы, потому что javascript не является действительно многопоточным.Afaik функция никогда не останавливается в середине этого, просто чтобы предоставить другую функцию javascript во время выполнения того же документа ...

Итак, у кого-нибудь есть имя для этого? : -)

Мне нужен этот шаблон на самом деле довольно часто, особенно со сложными бэкэнд-интерфейсами .. (и да, я думаю, я превращу вышеописанную прикладную реализацию в более повторно используемый JavaScript)... С массивом gates и целевой функцией.)

Ответы [ 4 ]

2 голосов
/ 11 октября 2010

Для меня это звучит как Образец .

1 голос
/ 11 октября 2010

Это похоже на шаблон Rendezvous , хотя этот шаблон обычно используется в контексте многопоточных систем реального времени.

1 голос
/ 11 октября 2010

Понятия не имею, если у вашего паттерна есть специальное имя, но оно похоже на простое использование счетного семафора, который блокирует поток, который запустил все эти другие действия, пока все они не сделали V-вызов. Конечно, в JavaScript нет потоков и семафоров, но вместо использования множества логических переменных вы можете использовать только одно целое число для подсчета.

0 голосов
/ 11 октября 2010

Помимо фактического ответа на ваш вопрос, вас может заинтересовать инфраструктура Rx для Javascript.Это порт .NET-версии, позволяющий составлять события, поэтому вам не нужно работать с тоннами переменных-флагов.Он предназначен для такого рода вещей.

http://msdn.microsoft.com/en-us/devlabs/ee794896.aspx

...