我有一個正在運行的快速應用程式,它偵聽 GET 請求。任何 GET 請求都會立即回傳一個成功回應并運行一個函式asyncForLoop(),該函式回傳一個 5 秒后決議的承諾。
問題:即使asyncForLoop()在res.json()任何即將到來的 GET 請求之后被呼叫也會延遲,直到承諾asyncForLoop()得到解決。
const express = require("express");
const app = express();
app.listen(3005, () => {
console.log(new Date().getTime() " running on port 3005.");
});
app.get("/*", (req, res) => {
myResponse(req, res);
});
function myResponse(req, res) {
console.log(new Date().getTime() " GET request => " req.originalUrl);
res.json({ success: true });
// this function blocks any following request until it is resolved
asyncForLoop().then(res => {
console.log(new Date().getTime() " finished for-loop.");
});
}
function asyncForLoop() {
return new Promise(function(resolve, reject) {
// simulate a long synchronous action using wait() in a for-loop
for (let i=0; i<5; i ) {
console.log(i);
wait(1000);
}
resolve();
});
}
function wait(ms) {
let start = Date.now(),
now = start;
while (now - start < ms) {
now = Date.now();
}
}
您可以通過運行腳本node并localhost:3005在瀏覽器中打開帶有地址的兩個選項卡來測驗上面的代碼。第一個選項卡將立即得到回應,而第二個選項卡加載 5 秒。

問題:為什么里面的 promise 會asyncForLoop()延遲即將到來的請求?不應該異步處理它,因為它在承諾中嗎?如何防止這種延遲的第二個請求?
Thanks!
uj5u.com熱心網友回復:
JavaScript 是單執行緒的。長時間運行的回圈將阻塞您的所有代碼。您可以使用異步wait函式:
const express = require("express");
const app = express();
app.get("/*", (req, res) => {
myResponse(req, res);
});
async function myResponse(req, res) {
console.log(new Date().getTime() " GET request => " req.originalUrl);
res.json({ success: true });
await asyncForLoop();
console.log(new Date().getTime() " finished for-loop.");
}
async function asyncForLoop() {
for (let i=0; i<5; i ) {
console.log(i);
await wait(1000);
}
}
function wait(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
app.listen(3005, () => {
console.log(new Date().getTime() " running on port 3005.");
});
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/345375.html
