[其中之一花费太多时间时如何同时响应不同的请求
我有2个请求1 /斐波那契(大约需要10秒)和2 / hello(立即)
当我尝试在斐波那契之后连续运行2页“消息”时我都用邮递员get-http://localhost:3001/fibonacci后[http://localhost:3001/hello
所以我的代码同步运行,但我希望它异步运行,我尝试了promise并等待,但是它们都对我不起作用。
const express = require('express')
const app = express()
const bigInt = require("big-integer");
const port = process.env.PORT || 3001
app.get('/fibonacci',async (req,res) => {
res.send(fibonacci(bigInt(700000)))
})
app.post('/hello',async (req, res) => {
res.send("message")
})
const fibonacci = (num) => {
var a = bigInt(1), b = bigInt(0), temp = bigInt
while (num > 0){
temp = a
a = (a.add(b))
b = temp
num= (num.add(-1))
}
return b;
}
app.listen(port, () => {
console.log('Server is up on port ' + port)
})
我希望可以立即看到所看到的消息,但这是在斐波那契计算之后得出的。
回答如下:Node.js异步运行,但它不是多线程的。因此,一旦您的节点/表达程序开始运行fibonacci()
,在该功能完成之前,它将无法运行其他任何东西。
为了使您的节点/表达程序保持响应,您必须找到一种方法来使用setTimeout()
对Fibonacci计算的小块进行逐个调度,直到计算完成为止。使用setTimeout()
可让node.js暂停处理计算以处理其他事情。
对类似Fibonacci的算法进行分组需要一些思考和大量测试。为您执行此操作超出了StackOverflow答案的范围。另外,如果这里有这样的答案,人们可能会将其用作魔术,而不是理解它。
这里是另一个问题,提供了一些有用的答案。 How to break up a long running function in javascript, but keep performance