我見過一些非常相似的問題/答案,但沒有一個能準確描述我想要實作的目標。一些背景,這是一個多步驟的規定流程。簡而言之,這就是目標。
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 分鐘,強制它跳出回圈并呼叫“失敗”函式。
- 我不確定的另一件事(這里是 NodeJS 新手)是,假設這個 get 被呼叫了 4 次,在這 4 次中的任何一次完成之前使用不同的 IP,NodeJS 將在每??個自己的背景關系中運行每個呼叫,對嗎?我很快對此進行了測驗,似乎是這樣。
uj5u.com熱心網友回復:
我不確定這是否確實是最好/干凈的方式。
不確定您的函式是否GetNewDeviceId涉及遞回,即它是否將自身呼叫為service.GetNewDeviceId. 那沒有意義,service.GetNewDeviceId應該執行 GET 請求,對嗎?如果是這樣,您的功能對我來說似乎很干凈。
我如何設定全域超時,比如說 30 分鐘,強制它跳出回圈并呼叫“失敗”函式。
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副本。responsefailAt
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/534599.html
標籤:节点.js表示
下一篇:將陣列傳遞給后端
