我想知道 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] 删除。
我来说两句