5

我基本上很确定这种模式一定存在并且有一个名字......现在我称之为“门模式”......

这里是:

在我网页的 javascript 中,我必须触发各种异步进程。我们先不讨论 async js 到底有多真实,但无论如何我必须触发 2 或 3 个 AJAX 调用,必须确定,UI 构建已经完成,等等。

只有这样,当所有这些过程都完成后,我才想运行某个功能。并且恰好一次。

例子

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 将检查标志,如果任何标志仍未设置,则返回,仅调用目标函数,如果所有标志(或我称之为:gates)都打开。如果我所有的异步前置条件只调用了一次gatedAction(),我希望我可以确定,实际的targetFunction 只调用了一次()。

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

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

在实践中,它可靠地工作。附带说明:我认为 java 典型(不是 js 典型)同步/易失性问题可以忽略,因为 javascript 并不是真正的多线程。Afaik 一个函数永远不会在它中间停止,只是为了在同一个文档运行时授予另一个 javascript 函数......

所以,任何人,有这个的名字吗?:-)

实际上,我经常需要这种模式,尤其是对于复杂的后端 UI。(是的,我认为,我会将上述丑陋的实现变成更可重用的 javascript ......使用门数组和目标函数。)

4

4 回答 4

2

对我来说,这听起来像是犹豫不决的模式

于 2010-10-11T09:31:26.587 回答
1

它类似于Rendezvous 模式,尽管该模式通常用于多线程实时系统的上下文中。

于 2010-10-11T10:30:25.953 回答
1

我不知道,如果你的模式有一个特殊的名称,但它似乎相当于只使用一个计数信号量,它阻塞线程,它启动了所有其他操作,直到它们都进行了 V 调用。当然,JavaScript 中没有线程和信号量,但您可以只使用一个整数来计数,而不是使用许多布尔变量。

于 2010-10-11T10:27:09.830 回答
0

除了您的问题的实际答案之外,您可能对 Javascript 的 Rx 框架感兴趣。它是 .NET 版本的一个端口,允许您编写事件,因此您不必使用大量的标志变量。它是为这种事情准备的。

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

于 2010-10-11T10:01:34.407 回答