Javascript 节点Js不是异步的

Javascript 节点Js不是异步的,javascript,node.js,Javascript,Node.js,我有一个node js应用程序,它有两个GET请求,例如-test和delay var express = require("express"); var app = new express(); app.use('/', express.Router()); app.get('/delay', function (req, res) { for (var i = 0; i < 500000; i = i + 0.0001) { let r = 'r';

我有一个node js应用程序,它有两个
GET
请求,例如-test和delay

var express = require("express");
var app = new express();
app.use('/', express.Router());

app.get('/delay', function (req, res) {
    for (var i = 0; i < 500000; i = i + 0.0001) {
        let r = 'r';
    }
    res.json({ 'message' : 'delay message'});
})

app.get('/test', function (req, res) {
    res.json({ 'message': 'hello world' });
})

app.listen(1337);
var express=require(“express”);
var app=new express();
app.use('/',express.Router());
应用程序获取('/delay',函数(req,res){
对于(变量i=0;i<500000;i=i+0.0001){
设r='r';
}
res.json({'message':'delay message'});
})
app.get('/test',函数(req,res){
res.json({'message':'helloworld});
})
app.listen(1337);
delay
方法执行并产生延迟输出,如大约6-7秒后,而
test
方法立即产生输出

但是在Postman中进行测试时,如果我运行
delay
方法,并且在其完成之前运行
test
,那么
test
的输出直到
delay
完成后才会出现。只有在
delay
完成后,我才能获得
test
的输出

如何使这两个请求并行运行,彼此独立

附言:我也试过路由器(express.router()),但还是一样


谢谢

延迟端点被阻塞,这是一个占用服务器运行的单线程的昂贵循环。您需要将线程的控制权交给全局事件循环,这样它就可以自由地接受新的请求,并将事件安排在以后发生。通常,您可以使用或使用其他接受回调的异步API来执行此操作:

app.get('/delay', function (req, res) {
    setTimeout(function () { res.json({ 'message' : 'delay message'}); }, 6000);
})

如果您确实有一个必须运行才能完成的昂贵任务,那么您需要研究线程或将其移动到一个完全不同的进程中,您可以通过套接字或其他方式与之通信。

端点阻塞了
延迟,这是一个占用服务器运行的单个线程的昂贵循环。您需要将线程的控制权交给全局事件循环,这样它就可以自由地接受新的请求,并将事件安排在以后发生。通常,您可以使用或使用其他接受回调的异步API来执行此操作:

app.get('/delay', function (req, res) {
    setTimeout(function () { res.json({ 'message' : 'delay message'}); }, 6000);
})

如果您确实有一项昂贵的任务必须运行才能完成,那么您需要研究线程或将其转移到一个完全不同的进程中,您可以通过套接字或其他方式进行通信。

您不能。Node.js在单个线程上运行事件循环。如果您有阻塞代码,那么它将阻塞

避免执行CPU密集型操作(如在不做任何重要事情的情况下反复循环)


您可以采取一些方法来缓解此类问题(例如使用
setTimeout
批量处理数据,让事件队列中的其他事件在批之间运行),但处理任何给定问题的最佳方法将取决于实际问题。

您不能。Node.js在单个线程上运行事件循环。如果您有阻塞代码,那么它将阻塞

避免执行CPU密集型操作(如在不做任何重要事情的情况下反复循环)


您可以采取一些方法来缓解这类问题(例如使用
setTimeout
批量处理数据,让事件队列中的其他事件在批之间运行),但处理任何给定问题的最佳方法将取决于实际问题。

Node.js的工作原理就是这样。它是一个单线程事件循环,与其他服务器实现不同,其他服务器实现在每个请求一个线程的基础上运行,这可能正是您所想的

通常,您不希望通过在请求中执行一个长时间的cpu密集型操作来锁定主线程。相反,您可能会将其交给工作人员或类似人员,如
setTimeout


当然,您可以拥有更多的Node.js实例,并以某种方式对它们进行集群,这样您的两个调用就可以负载平衡到单独的后端Node.js服务器,但在您的情况下,似乎更需要在长时间运行的方法中采用一种更异步的方法来释放主线程来服务其他调用。

Node.js就是这样工作的。它是一个单线程事件循环,与其他服务器实现不同,其他服务器实现在每个请求一个线程的基础上运行,这可能正是您所想的

通常,您不希望通过在请求中执行一个长时间的cpu密集型操作来锁定主线程。相反,您可能会将其交给工作人员或类似人员,如
setTimeout


当然,您可以拥有更多的Node.js实例,并以某种方式对它们进行集群,这样您的两个调用就可以负载平衡到单独的后端Node.js服务器,但在您的情况下,似乎更可能只需要在长时间运行的方法中采用一种更异步的方法来释放主线程来服务其他调用。

for循环执行时间太长,而且它不是异步代码,而是同步代码。不过,您可以将for块提取到另一个返回promise的函数。通过这种方式,您可以在代码中实现异步性。

for循环执行时间太长,而且它不是异步代码,而是同步代码。不过,您可以将for块提取到另一个返回promise的函数。通过这种方式,您可以在代码中实现异步性。

很抱歉,那么我该如何使两者并行运行?因为我有很多路由,并且接收到很多请求,其中一些请求可能需要一些时间才能执行,所以所有其他请求现在都必须等到每个路由完成,,很抱歉,那么我怎样才能使两者并行运行呢?因为我有很多路由,并且收到很多请求,其中一些请求可能需要一些时间才能执行,所以所有其他请求现在都必须等到每个路由完成,那么,如果是单线程的,那么处理多个路由的最佳方法是什么??我已经编写了一个web api应用程序,现在还没有