繁体   English   中英

Node.JS 页面仅加载大约 50% 的时间

[英]Node.JS Page only loads about 50% of the time

我的 node.js 文件中有一个名为 parsedata 的函数,该函数在用户登录时调用。调用 parsedata() 后,服务器切换到新屏幕。 但是,这只适用于每隔一段时间。 我在两者之间放置了一个异步等待,这使它在大约 90% 的时间里工作,但我只是想知道它为什么这样做。 我相信它与所有正在使用的辅助函数有关,但我不完全确定。 任何信息或帮助将不胜感激!

 app.post("/login.html", urlencodedParser, async (req, res) => { await parseData(); //await sleep(750); res.redirect(__dirname + "/homescreen.html"); }); async function parseData() { let dates = await findCommon(); let maxStreak = await getMaxStreak(dates); } async function findCommon() { var dates = new Set(); var data = await fs.readFile(__dirname + "/mem.txt", "utf8", (err, data) => { if (err) { console.error(err); return; } return data; }); for (let i = 0; i < data.length; i++) { if (data[i] === "*" && i + mostRecentName.length < data.length) { if (data.slice(i + 1, i + mostRecentName.length + 1) == mostRecentName) { while (data[i] != "\n") { i++; } if (i < data.length - 1) { i++; } while (data[i] != "*" && i < data.length) { let curr = ""; let count = 10; while (count > 0) { count--; curr += data[i]; i++; } while (data[i] != "\n") { i += 1; } if (i < data.length - 1) { i++; } dates.add(curr); } } } } dates = Array.from(dates); dates = await bubbleSort(dates); return dates; } async function getMaxStreak(dates) { let today = new Date(); let year = today.getFullYear().toString(); let month = (today.getMonth() + 1).toString(); let day = today.getDate().toString(); if (month.length == 1) { month = "0" + month; } if (day.length == 1) { day = "0" + day; } let testDate = year + "-" + month + "-"+ day; if (!(testDate in dates)) { dates.push(testDate); } let streak = 1; for (let i = dates.length - 1; i > 0; i--) { let options; if (i == dates.length - 1) { options = await convert(testDate); } else { options = await convert(dates[i]); } if (dates[i - 1] == options[0] || dates[i - 1] == options[1] || dates[i - 1] == options[2]) { streak++; } else { return streak; } } return streak; } async function convert(date) { let option1Day = (parseInt(date.slice(8, 10)) - 1).toString(); if (option1Day.length == 1) { option1Day = "0" + option1Day; } let option2Month = (parseInt(date.slice(5, 7)) - 1).toString(); if (option2Month.length == 1) { option2Month = "0" + option2Month; } let option2Day = "30"; let option3Day = "31"; let option1 = date.slice(0, 8) + option1Day; let option2 = date.slice(0, 5) + option2Month + "-" + option2Day; let option3 = date.slice(0, 5) + option2Month + "-" + option3Day; return [option1, option2, option3]; }

它与宏任务和微任务有关。您的代码与以下代码具有相同的结果:

new Promise((resolve, reject) => {
  findCommon().then(dates => {
    getMaxStreak(dates).then(maxStreak => {})
  })
     
  resolve()
})
.then(() => { 
  res.redirect(__dirname + "/homescreen.html")
})

res.redirect将被添加到微任务队列中; 然后, getMaxStreak也将被添加到微任务队列中。 最后,我们会取出微任务队列的第一个任务来执行,没错,是res.redirect ,而不是getMaxStreak

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM