Node.js:如何识别脚本是异步还是非阻塞的

3

Node.js被认为是异步、事件驱动和非阻塞I/O的,但我怎么知道我的脚本是异步的?还是非阻塞的?

2个回答

2
“阅读代码;)当库是异步的时,往往会实现 continuation- 或 message passing-style 代码。通常你可以故意使调用阻塞并看看它如何反应。或者更好的方法:分析你的代码。

我不知道有哪些工具可以回答“输入的代码是异步还是同步”的真假问题:)

或者你可以分享代码或一些更多的上下文吗?

编辑:

你能给一个阻塞或非异步代码的例子吗? - hexacyanide

这个问题在这里有讨论: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

2
这里有一份异步函数列表,包括:
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

同步代码是按照一行一行的顺序执行,行的顺序很重要。而异步代码则相反:行的顺序(几乎)不重要。在使用process.nextTick的例子中,您可以更改process.nextTickconsole.log('test')的顺序,结果仍将保持不变。
阅读文档并尝试记住所有基本的异步函数。
还有一个建议:最好的学习方式是边做边学。;-)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接