我看到过一些非常相似的问题/答案,但没有一个确切地描述我想要实现的目标。介绍一下背景,这是一个多步骤的供应流程。简而言之,这就是目标。
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
的每次调用都建立了一个新的执行上下文(称为"闭包"),具有自己的参数req
和res
的副本以及变量response
和failAt
。