这个模式有名字吗?

时间:2010-10-11 09:21:43

标签: javascript design-patterns gateway

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

这是:

在我的网页的javascript中,我必须触发各种异步进程。我们不讨论如何完全异步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将检查标志,如果仍未设置任何标志则返回,仅调用目标函数,如果所有标志(或我称之为:gate)都打开。如果我的所有异步前置条件都只调用一次gatedAction(),我希望我可以肯定,实际的targetFunction只调用一次()。

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

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

在实践中它可靠地工作。旁注:我认为java-typical(不是js-typical)同步/ volatile问题可以忽略,因为javascript不是真正的多线程。 Afaik函数永远不会停在它的中间,只是为了在同一个文档运行时授予另一个javascript函数...

所以,有人,这有名字吗?: - )

我实际上经常需要这种模式,特别是对于复杂的后端UI ..(是的,我认为,我会将上面的对接丑陋的实现变成一个更可重用的javascript ...带有一个gate数组和一个target函数。)

4 个答案:

答案 0 :(得分:2)

对我来说听起来像Balking pattern

答案 1 :(得分:1)

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

答案 2 :(得分:1)

它类似于Rendezvous pattern,尽管该模式通常用于多线程实时系统。

答案 3 :(得分:0)

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

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