Node.js 中的同步块

瑞安·凯尔西

我想知道 Node.js 应用程序中是否可以有同步块。我是 Node 的新手,但我找不到任何关于我正在寻找的行为的好的答案。

我的实际应用程序会涉及更多,但本质上我想做的是支持 GET 请求和 POST 请求。POST 请求会将一个项目附加到存储在服务器上的数组中,然后对数组进行排序。GET 请求将返回数组。显然,当多个 GET 和 POST 同时发生时,我们需要正确性保证。这是一个非常简单的示例,说明代码理论上的样子:

var arr = [];

app.get(/*URL 1*/, function (req, res) {
    res.json(arr);
});

app.post(/*URL 2*/, function (req, res) {
    var itemToAdd = req.body.item;
    arr.push(itemToAdd);
    arr.sort();
    res.status(200);
});

我担心的是一个GET请求返回数组它或排序之前,但该项目被追加后,更糟的是,返回数组作为它进行排序。在像 Java 这样的语言中,我可能只使用 ReadWriteLock。从我读到的关于 Node 的异步性来看,它似乎不会arr以保留这种行为的方式访问,但我很想被证明是错误的。

如果无法修改我目前必须支持此行为的代码,是否还有其他替代方法或解决方法可以让应用程序执行我希望它执行的操作?

特洛特

我担心的是 GET 请求在排序之前返回数组,但在附加项目之后,或者更糟糕的是,在排序时返回数组。

对于此处的代码,您不必担心(尽管请继续阅读,因为您可能想担心其他事情!)。Node.js 是单线程的,因此在将控制权返回给事件循环之前,每个函数都将完整运行。因为您的所有数组操作都是同步的,所以您的应用程序将等到数组操作完成后再GET响应请求。

当然,需要注意的一件事是(例如)是否.sort()需要很长时间。如果是这样,您的服务器将在此过程中阻塞。这就是为什么人们倾向于支持异步操作的原因。但是,如果您的阵列保证很小和/或这是一个用户数量有限的应用程序(例如,它是一个小公司的内部网应用程序),那么您所做的可能会正常工作。

为了更好地理解整个单线程 + 事件循环的事情,我推荐Philip Roberts 关于事件循环的演讲

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在node.js中同步调用

来自分类Dev

同步node.js中的查询(或事件)

来自分类Dev

如何使Node js同步?

来自分类Dev

Node JS 同步事件

来自分类Dev

如何在Node.js中同步读取文件内容?

来自分类Dev

如何在Node.js中同步连接到MongoDB

来自分类Dev

如何在node.js的同步函数中捕获错误?

来自分类Dev

如何从Node.js中的URL同步下载文件

来自分类Dev

Node.js中的'console.time'是同步还是异步?

来自分类Dev

express / node.js中的请求之间的同步问题

来自分类Dev

在Node.js中附加多个gzip文件(同步)

来自分类Dev

从Node.js中的文件同步读取行

来自分类Dev

变量分配在Node.js中是同步的吗?

来自分类Dev

mongodb(+ mongoose)+ node.js中的同步查询

来自分类Dev

如何从在node.js中同步的内部函数取回?

来自分类Dev

在Node.js中与单例同步问题readdir

来自分类Dev

express / node.js中的请求之间的同步问题

来自分类Dev

Node js中的回调函数是否以同步方式执行?

来自分类Dev

如何从node.js中的HTTP请求获取同步结果

来自分类Dev

Node.js中数据同步的最佳实践

来自分类Dev

如何使此代码在Node.Js中同步运行?

来自分类Dev

在 node.js 中同步获取 mysql 查询的输出

来自分类Dev

Node.js WriteStream同步

来自分类Dev

Node.js同步与异步

来自分类Dev

Node.js同步循环

来自分类Dev

如何使Node JS的句柄异步功能在Node JS中同步

来自分类Dev

mysql / node.js如何使/伪同步?

来自分类Dev

请求之间的Node.js同步

来自分类Dev

Node js异步转换为同步