Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 这个图案有名字吗?_Javascript_Design Patterns_Gateway - Fatal编程技术网

Javascript 这个图案有名字吗?

Javascript 这个图案有名字吗?,javascript,design-patterns,gateway,Javascript,Design Patterns,Gateway,我基本上相当肯定这种模式一定存在,并拥有一个名称。。。现在我称之为“门模式” 在这里: 在我的网页javascript中,我必须触发各种异步进程。我们不讨论trully async js是如何实现的,但无论如何,我必须触发2到3个AJAX调用,必须确保UI构建已经完成,等等 只有这样,当所有这些过程都完成后,我才想运行某个函数。就一次 示例 1: cropStore loaded() 2: resizeEvent() 3: productStore loaded() 模式: 在每个(成功的)A

我基本上相当肯定这种模式一定存在,并拥有一个名称。。。现在我称之为“门模式”

在这里:

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

只有这样,当所有这些过程都完成后,我才想运行某个函数。就一次

示例

1: cropStore loaded()
2: resizeEvent()
3: productStore loaded()
模式: 在每个(成功的)Ajax加载回调结束时,GUI构建例程结束时,等等。。。我将各自的标志从false设置为true,并调用gatedAction()

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

gatedAction()
{
//大门
如果(!f1)返回;
如果(!f2)返回;
如果(!f3)返回;
//实际操作(f1==f2==f3==true)
targetFunction();
}
实际上,它工作可靠。另一方面:我认为java典型(而不是js典型)的同步/易失性问题可以忽略,因为javascript不是真正的多线程。AFIK函数在中间没有停止,只是为了在同一个文档运行时授予另一个JavaScript函数…< /P> 那么,各位,这有名字吗?:-)
实际上,我经常需要这种模式,尤其是对于复杂的后端UI。。(是的,我想,我将把上面这个难看的实现变成一个更可重用的javascript…带有一个gates数组和一个目标函数。)

我觉得这听起来很像。

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


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

这与类似,尽管这种模式通常用于多线程实时系统的上下文。

这是一个很好的第一个指针!塔克斯。不过,它只谈到一个先决条件。我的“一次到位”咒语(面对来自多个调用/线程)也没有反映出来……在这种情况下,先决条件是“所有这些方法都已完成执行”;它仍然是一个单一的先决条件。阻止是关于操作对象状态的,但是可以检查任意数量的状态,事实上,这通常作为一个开关来实现。参考我所听到的模式,它被各种各样地称为“看门人”、“监护人”或“关于检查输入的子句模式”。我很难用谷歌搜索这些(在软件环境中,有很多子句模式…)。这里有一个与软件相关但仍然离题(尽管很有趣)的看门人模式(想想:Scrum MC/PO),即使我把它翻译成软件本身,它也是不同的。酷。我们快到了!“将多个线程的同步具体化为一个对象本身”非常适合(上面的模式并不是指单个线程,在一个大页面中可以有不同的东西“共同等待”。“集合对象可能包含要共享的数据,因为线程同步”实际上涵盖了一个指定的点。因为一旦所有先决条件线程都完成了它们的部分,实际上,targetAction就必须访问一些关于“它们的工作”的内容。因此,让线程将“他们的东西”(result/construct reference)作为gatedAction()的数组参数存放,比通过其他(更狡猾的)方法传递它更有意义……但是太重了。我想到的应该适合20-30行javascript,即使是通用形式。(看看典型的ExtJSJavaScript代码,至少这是我的估计)!“>您可以只使用一个整数进行计数”在实践中:不。调整大小事件这样的事情是臭名昭著的,它会多次触发,即使是在一次调整大小时。(好吧,我的问题措辞不准确:目标行动准确一次,毕竟所有先决条件行动至少一次可能是命中目标的原因)
onEvent( 'load',
{
   ....  // whatever has to happen in response to cropStored, resized, etc...
   // lastly:
   f1 = true; //resp f2, f3, ...
   gatedAction();
}
gatedAction ()
{
   // Gate
   if ( ! f1) return;
   if ( ! f2) return;
   if ( ! f3) return;

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