NodeJS - While循环,直到满足一定条件或经过一定时间



我看到过一些非常相似的问题/答案,但没有一个确切地描述我想要实现的目标。介绍一下背景,这是一个多步骤的供应流程。简而言之,这就是目标。

1. POST an action.
2. GET status based in one variable submitted above. If response == "done" then proceed. Returns an ID.
3. POST an action. Returns an ID.
4. GET status based on ID returned above. If response == "done" then proceed. Returns an ID.
5. (..)

我想总共有6/7个步骤。

第一个问题是,有没有任何模块可以帮助我以某种方式实现这一点?唯一的要求是,每次获取状态的尝试都应该有X量的延迟,并且应该过期,在X量的时间后将流标记为失败。

然而,我能得到的最好的是,假设步骤2:

GetNewDeviceId : function(req, res) {
const delay = ms => new Promise((resolve, reject) => setTimeout(resolve, ms));
var ip = req;
async function main() {
let response;
while (true) {
try {
response = await service.GetNewDeviceId(ip);
console.log("Running again for: " + ip + " - " + response)
if (response["value"] != null) {
break;
}
} catch {
// In case it fails
}
console.log("Delaying for: " + ip)
await delay(30000);
}
//Call next step
console.log("Moving on for: "+ ip)
}
main();
}

这带来了几个问题,

  • 我不确定这是不是最好的/干净的方式。
  • 我如何设置一个全局超时,比如30分钟,迫使它跳出循环并调用"failure"函数。
  • 另一件事我不确定(NodeJS新手在这里)是,假设这个get被调用让我们说4次,在这4个完成之前使用不同的IP, NodeJS将在每个自己的上下文中运行每个调用对吗?我很快测试了一下,看起来是这样的。

我不确定这是不是最好的/干净的方法。

它不确定你的函数GetNewDeviceId是否涉及递归,也就是说,它是否调用自己作为service.GetNewDeviceId。这没有意义,service.GetNewDeviceId应该执行GET请求,对吗?如果是这样的话,你的函数对我来说似乎很干净。

我如何设置一个全局超时,比如30分钟,迫使它跳出循环并调用"failure"函数。

let response;
let failAt = new Date().getTime() + 30 * 60 * 1000; // 30 minutes after now
while (true) {
if (new Date().getTime() >= failAt)
return res.status(500).send("Failure");
try {...}
...
await delay(30000);
}

我不确定的另一件事(这里的NodeJS新手)是,假设这个get被称为我们说4次,在这4次完成之前使用不同的IP, NodeJS将在每个自己的上下文中运行每个调用对吗?

是的。函数GetNewDeviceId的每次调用都建立了一个新的执行上下文(称为"闭包"),具有自己的参数reqres的副本以及变量responsefailAt

最新更新