在节点中执行setTimeout(fx, 0)
有什么意义?
这不是异步甚至非阻塞,因为async函数实际上是setTimeout
,而不是fx
,并且在setTimeout
异步运行后,您将最终运行fx
无论如何都会阻止你的代码。
使用setTimeout
0
来调用函数fx
只会等到堆栈为空以运行fx
,但是fx
是setTimeout(fx, 0)
让你无法接受任何请求,对吗?
所以<form id="searchform" class="navbar-form" role="search" method="post" action="/echo/json">
abc
<div class="input-group">
<input type="text" class="form-control" style="width: 300px;" placeholder="Search" name="searchterm" id="srch-term" value="">
<div class="input-group-btn">
<button class="btn btn-default" type="submit">Search</button>
</div>
</div>
</form>
$("#searchform").submit(function(e) {
e.preventDefault();
var form = $(this);
$.ajax({
type: "POST",
url: "/echo/json",
data: form.serialize(),
dataType: "json",
success: function(data) {
if (data.length > 0) {
console.log(data);
} else {
console.log('Nothing in the DB');
}
}
}, "json");
});
只是一种告诉节点的方式嘿嘿,只要你能做到就这样运行吗?有没有办法在Node中运行异步函数?
答案 0 :(得分:1)
如果你的问题是:
节点可以同时并行运行功能吗?
然后答案是肯定的,但你必须使用网络工作者。
节点中异步的范例与传统定义不同。期望您不在节点中运行太多超长运行功能。这样就实现了有效的异步性。
节点适用于某些事情,而不是其他环境,就像任何环境一样。
有关更详细的答案,请参阅here
至于
setTimeout(...,0)
来电;有时在耗时的任务中休息以允许队列中的呼叫可能需要它们的处理份额。以不同方式划分任务可以使您免于这些;但是,这不是真正的黑客攻击,它只是事件队列工作的方式。另外,使用process.nextTick
来实现这个目标要好得多,因为当你使用setTimeout时,需要计算和检查传递的时间,而process.nextTick
就是我们真正想要的:“嘿任务,回到队列结束时,你已经使用了你的分享!“
答案 1 :(得分:1)
如果我理解你的问题,答案如下:
由于JavaScript是一种单线程语言,它仍然能够分别处理两件事。
使用setTimeout(fx, 0)
允许您在&#34;等待qeue&#34;中推送setTimeout函数中的函数或操作。一旦操作堆完成,该函数就会被放到执行堆栈中并被执行。
有关详细信息,请参阅此video