3

Node.js 被声明为异步的、事件驱动的、非阻塞 I/O,但我如何识别我的脚本是否是异步的?还是非阻塞?

4

2 回答 2

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

于 2012-09-25T02:07:44.290 回答
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

因此,同步代码是一种在一行之后触发一行的代码,并且行的顺序很重要。异步代码则相反:行的顺序(几乎)无关紧要。在示例中,您可以更改andprocess.nextTick的顺序,结果仍然相同。process.nextTickconsole.log('test')

阅读文档并尝试记住所有基本的异步函数。

还有一个建议:最好的学习方式是边做边学。;-)

于 2012-09-27T08:23:37.517 回答