【发布时间】:2014-12-24 07:23:54
【问题描述】:
如何进行简单的非阻塞 Javascript 函数调用?例如:
//begin the program
console.log('begin');
nonBlockingIncrement(10000000);
console.log('do more stuff');
//define the slow function; this would normally be a server call
function nonBlockingIncrement(n){
var i=0;
while(i<n){
i++;
}
console.log('0 incremented to '+i);
}
输出
"beginPage"
"0 incremented to 10000000"
"do more stuff"
如何形成这个简单的循环来异步执行并通过回调函数输出结果?这个想法是不阻止“做更多的事情”:
"beginPage"
"do more stuff"
"0 incremented to 10000000"
我尝试过遵循有关回调和延续的教程,但它们似乎都依赖于外部库或函数。他们都没有在真空中回答这个问题:如何将 Javascript 代码编写为非阻塞的!?
在问之前我已经非常努力地寻找这个答案;请不要以为我没有看。我发现的所有内容都是 Node.js 特定的([1]、[2]、[3]、[4]、[5])或其他特定于其他函数或库的内容([6]、[7]、[8]、 [9]、[10]、[11]),尤其是 JQuery 和 setTimeout()。请帮助我使用 Javascript 编写非阻塞代码,而不是像 JQuery 和 Node 这样的 Javascript 编写的工具。 请在将其标记为重复之前重新阅读该问题。
【问题讨论】:
-
毫不费力。您实际上必须告诉线程休眠一段时间才能阻塞线程。为避免睡眠,请使用带有回调的计时器。 sitepoint.com/settimeout-example
-
没有办法做到这一点。 Javascript 不是多线程的,只能对任务进行排队。您可以稍后执行长时间运行的任务,但不能与其他任务同时执行。
-
@AndrewHoffman 我不确定你是否理解。你不能让 JS 进入睡眠状态,但你可以让它忙到 UI 循环不能服务任何事件。
-
你可以用警报之类的东西来阻止线程,我希望每个浏览器都会禁用它。糟糕的程序员冻结了我的浏览器。 -_-'
-
在mozilla developer network 中搜索
fork()或exec()或pthread(),你会发现是空的。为什么?因为对子进程和线程的支持不是浏览器 javascript 的标准功能。 Web workers 是一项实验性功能,旨在创建可以通信但不共享范围的其他进程。不支持按照您的建议同时运行 CPU 代码。实际上,引用的所有“异步”JS 代码都是关于 I/O 事件的。在 I/O 上:blah()
标签: javascript asynchronous callback nonblocking