Node.js 被声明为异步的、事件驱动的、非阻塞 I/O,但我如何识别我的脚本是否是异步的?还是非阻塞?
2 回答
阅读代码;)当库是异步的时,这通常很明显,因为它通常有助于延续或消息传递样式的代码。通常,您可以故意阻止呼叫并查看它的反应。或者更好:分析您的代码。
我不知道有任何工具可以对“输入代码是异步还是同步”回答真假:)
或者您可以共享代码或更多上下文:)?
编辑:
你能给我一个阻塞或非异步代码的例子吗?– 六氰化物
这个问题对此有一个讨论:JavaScript什么时候同步?
同步代码将是这样的:
console.log("first");
console.log("second");
console.log("third");
这三行代码同步运行——第一行,第二行,第三行。
相反,此代码异步运行:
function f() {
alert("first");
}
function g() {
alert("second");
}
// defer execution for 1000 ms
setTimeout(f, 1000);
// defer execution for 500 ms
setTimeout(g, 500);
// run immediately
alert("third");
您将首先看到“第三个”警报,然后是“第二个”,最后是“第一个”。这是一个非常人为的示例,但是您会看到回调(f 和 g)以及流程与同步代码的根本不同之处。
您可以阅读同步代码,并且大多数事情会像您阅读它们一样发生,其中 - 在异步代码中,事件将触发或回调被调用,并且执行路径可能不像同步阻塞代码那样明显。
Node.js 是异步代码的一个示例,其中大多数函数调用采用一组回调参数来表示成功、失败和其他可能适用的情况。
编辑2:
此链接有一些 Javascript 示例,其代码编写为同步/异步样式:Asynchronous Code Design with Node.js
有一个异步函数列表,包括:
process.nextTick( ... )
setTimeout( ... )
setInterval( ... )
从文件系统模块:
var fs = require( 'fs' );
fs.rename( ... )
fs.stat( ... )
fs.readFile( ... )
fs.writeFile( ... )
fs...
更多的fs
,基本上是异步的,它们的同步版本最后带有“Sync”后缀(虽然应该避免同步版本)。
还有很多很多例子。EventEmitters可以被认为是异步的(例如HTTP 服务器或流),尽管从技术上讲它们不是(它们依赖于异步操作)。
基本上,几乎所有接受callback
作为参数的东西都是异步的(或依赖于异步操作),例如:
process.nextTick( function( ) { // <--- the callback
console.log( 'nextTick' );
});
console.log( 'test' ); // <--- will fire before the callback, i.e. asynchronouos
请记住,这显然不是一个规则,值得注意的例子:
var arr = [ 1, 2, 3 ];
arr.forEach( function(el) { // <--- the callback
console.log( el );
});
console.log( 'test' ); // <--- will fire after the callback, i.e. synchronous
因此,同步代码是一种在一行之后触发一行的代码,并且行的顺序很重要。异步代码则相反:行的顺序(几乎)无关紧要。在示例中,您可以更改andprocess.nextTick
的顺序,结果仍然相同。process.nextTick
console.log('test')
阅读文档并尝试记住所有基本的异步函数。
还有一个建议:最好的学习方式是边做边学。;-)