代码之家  ›  专栏  ›  技术社区  ›  Frank N dqthe

这个图案有名字吗?

  •  5
  • Frank N dqthe  · 技术社区  · 15 年前

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

    这里是:

    在我的网页的javascript中,我必须触发各种异步进程。我们不要讨论真正的异步JS是如何的,但是无论如何,我必须触发2或3个Ajax调用,必须确保,UI构建已经完成,等等。

    只有到那时,当所有这些过程都完成时,我才希望运行一个特定的函数。就一次。

    例子

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

    模式: 在每个(成功的)Ajax加载回调结束时,GUI构建例程结束等…我将相应的标志从“假”设置为“真”,然后调用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 回复  |  直到 15 年前
        1
  •  1
  •   Kristopher Johnson    15 年前

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

        2
  •  2
  •   reko_t    15 年前

    听起来像 Balking pattern 对我来说。

        3
  •  1
  •   Dominik Seibold    15 年前

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

        4
  •  0
  •   JulianR    15 年前

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

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