Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/372.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/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_Callback_Blocking - Fatal编程技术网

Javascript:非阻塞回调(又一次)

Javascript:非阻塞回调(又一次),javascript,callback,blocking,Javascript,Callback,Blocking,我不是一个经验丰富的开发人员,在过去的几天里,我一直在努力理解Javascript的一些基本概念。 单线程、阻塞与非阻塞以及回调。 我读了很多书,但我仍然感到困惑 我的理解是,在一个简单的JS代码中,所有语句都在一个线程内顺序执行。 在存在长时间运行语句(db调用、网络交互等)的更复杂的情况下,这可能是一个巨大的问题。 程序执行(next语句)被阻止,直到当前(长时间运行)语句完成。 解决方案是实现一个异步模式,其中长时间运行的语句在后台执行(我在这里可能会大错特错!),同时执行下一个语句,当长

我不是一个经验丰富的开发人员,在过去的几天里,我一直在努力理解Javascript的一些基本概念。 单线程、阻塞与非阻塞以及回调。 我读了很多书,但我仍然感到困惑

我的理解是,在一个简单的JS代码中,所有语句都在一个线程内顺序执行。 在存在长时间运行语句(db调用、网络交互等)的更复杂的情况下,这可能是一个巨大的问题。 程序执行(next语句)被阻止,直到当前(长时间运行)语句完成。 解决方案是实现一个异步模式,其中长时间运行的语句在后台执行(我在这里可能会大错特错!),同时执行下一个语句,当长时间运行的语句完成时,它使用调用语句中提供的回调函数传回其结果

在这里和那里复制和粘贴代码我已经编写了一段简单的代码,其中有一个回调函数

// function with callback    
function doSomething(callback) {
    callback();
}

// callback function implementation
function doSomethingElse() {
    document.write("<p>Second element in the page</p>");
}

doSomething(doSomethingElse);   
document.write("<p>First element in the page</p>");
//带回调的函数
函数doSomething(回调){
回调();
}
//回调函数的实现
函数doSomethingElse(){
文档。写(“页面中的第二个元素”

”; } doSomething(doSomethingElse); 文档。写(“页面中的第一个元素”

”;
这段代码的结果实际上是我在开始阅读非阻塞和回调(顺序代码执行)之前所期望的结果: -第二要素 -第一要素

所以我的问题是,什么是将我的代码转换成异步非阻塞代码的神奇仙尘

干杯,乔瓦尼

什么是将我的代码转换成异步非阻塞代码的神奇仙尘

一般来说,大多数长时间运行的操作都是由API处理的,这些API处理异步操作的级别低于JavaScript(XMLHttpRequest用于发出HTTP请求就是一个主要示例)

如果您需要自己实现一个长时间运行的函数(也许您想在客户端上执行一些繁重的数字运算),那么您可以使用

查找素数.js

// Calculate some primes
postMessage(my_prime_number);

您已经使用了回调,但这并不意味着此调用是异步的

它同步运行
doSomething
,运行
callback
,并输出“第二个元素”

如果您在那里有一个异步调用—AJAX调用、文件系统访问或简单的
setTimeout
,那么它将是异步的:

函数doSomething(回调){
setTimeout(回调,1000);
}
//回调函数的实现
函数doSomethingElse(){
文档。写(“页面中的第二个元素”

”; } doSomething(doSomethingElse);
文档。写(“页面中的第一个元素”

回调不是决定天气的因素。代码是同步的还是异步的。同步回调的示例有
Array.forEach()
Array.sort()
。决定它们是异步的是,函数在低级C中实现为异步(使用select或poll、epoll或kqueue等)。但是,一旦函数是异步的,回调是在函数完成异步操作后执行代码的唯一方法。有关“魔法仙尘”的详细信息,请阅读:嘿,谢谢你的回答和示例。这是有道理的,但我遗漏了一点,为什么调用回调函数时没有括号?如何在没有括号的情况下将参数传递回回调。我试图更改您的代码--setTimeout(callback('hey'),1000);--我又回到了原来的状态behaviour@GiovanniVigorelli它被称为“闭包”。我已将函数作为变量传递。谈论带参数的函数时,不能以这种方式传递它们。您需要使用匿名函数:
setTimeout(function(){callback('hey');},1000)。谢谢你。这里有点离题,但对于node.js,所有内容都是异步的,还是同样的规则也适用于node.js?
// Calculate some primes
postMessage(my_prime_number);