JavaScript的信号量/testing和设置/锁?
在Javascript中是否有像primefacestesting和设置,信号量或locking的东西?
我有JavaScript通过自定义协议调用asynchronous后台进程(后台进程字面上运行在一个单独的进程,与浏览器无关)。 我相信我正处于竞赛状态; 后台进程返回我的testing和我的设置之间,搞砸了JavaScript的一面。 我需要一个testing和设置操作,使其成为一个真正的信号量。
以下是试图检测后台进程并将其排队的javascript代码:
Call = function () { var isRunning = true, queue = []; return { // myPublicProperty: "something", call: function (method) { if (isRunning) { console.log("Busy, pushing " + method); queue.push(method); } else { isRunning = true; objccall(method); } }, done: function() { isRunning = false; if (queue.length > 0) { Call.call(queue.shift()); } } }; }();
呼叫是一个实现排队的单身人士; 任何想调用外部进程的人都可以调用Call.call(“something”)。
有任何想法吗?
JavaScript没有locking语义,因为JS不是multithreading语言。 多个线程只能在完全不同的上下文中同时运行 – 例如。 HTML5 Worker线程,或者像JavaScriptCore API的上下文对象的多个实例(我假设SpiderMonkey有一个类似的概念)。 他们不能共享状态,所以实质上所有的执行都是primefaces的。
好吧,现在你已经提供了一些你的代码,我假设你有类似的东西:
External Process: <JSObject>.isRunning = true; doSomething() <JSObject>.done()
或者这样(使用适当的API)。 在这种情况下,如果JS在js对象的上下文中执行(这是JavaScriptCore会执行的操作),那么JS引擎就会阻塞,否则,您可能需要在js执行过程中手动locking。
你用什么引擎来做这一切? 我问,因为根据你的描述,听起来你正在使用该语言提供的C / C ++ API从一个非JS语言的辅助线程设置一个标志,而且大多数JS引擎都假定通过API进行的任何状态操作将发生在单个线程上,通常是所有执行发生的线程。
快速谷歌search“JavaScript互斥体”返回这篇文章(在JavaScript中实现互斥)。
也许你可以实现一个基本的整数信号量,只需将该variables添加到DOM并locking/解锁它,并确保你的函数继续检查它,否则超时它们=)
如果您使用的是诸如Mootools之类的框架,则可以尝试使用诸如onComplete等事件处理应用程序的stream程。
我有填充select列表的Ajax的东西,我需要它被locking,所以我做了这样的事情。 我想你可以做更简单的事情,尽pipe使用延期和pipe道什么的。
var semaphore=[]; function myFunc(arg){ var dfd; $.when(semaphore[table]).done( function(){ dfd=myFuncInner(arg); } ); return dfd; } function myFuncInner(table){ semaphore[arg] = new $.Deferred(); ... somethingasynchronous({ semaphore[arg].resolve(); }); return semaphore[arg]; }
首先,尽pipejavaScript是单线程的,但javaScript应用程序并不需要序列化机制。
一个简单的例子是,当一个提交button应该淡出一段时间,在这段时间内,服务器的Ajax请求正在工作。 当asynchronousAjax请求成功完成时,一个消息应该出现在button过去的位置。
尽pipe能够取消button的淡出并简单地将其样式设置为“display:none”,但是一旦Ajax请求完成,就不能在jQuery中实现。 此外,一个解决scheme可以使用事件来同步两个同时的活动,但这本质上是一个简单的问题矫枉过正。
一个低技术解决scheme是轮询一个锁,当淡出完成时,它被解锁,但是“服务器完成”消息不会显示,直到执行$ .post设置的成功callback。
var gl_lock; var gl_selfID; function poll_lock(message) { if (gl_lock === 0) { $('#output').text(message).fadeIn(200); window.clearInterval(gl_selfID); } } // end of poll_lock function worker() { // no one gets in or out gl_lock = 1; $.post(..., data,function() { gl_selfID = window.setInterval(poll_lock, 40, data.message); }, "json"); // end of fadeout unlock the semaphore $('#submit-button').fadeOut(400, function() { gl_lock = 0; }); } // end of worker
最后,我认为这是更详细的答案,正如先前在这个讨论中被perrohunter提出的那样。
我不确定这个问题到底在问什么,但是请查看我的信号量对象: https : //github.com/agamemnus/semaphore.js 。