重复调用 returns 承诺的函数,直到其中一个包含特定响应
Repeatedly call a function that returns a promise until one of them contains a specific response
你好,我需要调用一个带有 ID 的 REST 函数,returns React.js 中的一个承诺。该函数在调用时会在某个时候在其响应中包含特定值。在另一个服务处理初始请求之前,此值将为空。
这是我目前所做的:
while(myVariable){
myfunction(myID).then( (response) => {
if(response['value'] != null
myVariable = false;
}
});
}
此代码的问题在于 while 循环被尽可能快地调用,因此完全利用了计算机。因此,我需要一个允许我通过 ID 轮询结果的函数,直到其中一个函数调用的响应包含有效响应为止。
我尝试了以下方法但没有成功,因为我没有固定的运行次数:
谢谢你的问候。
如您所说,问题是 while 循环急切地运行,而不是等待每个承诺都解决。
解决这个问题的一种方法是使用递归。递归使您可以更好地控制何时 'loop' 接下来:
let getValue = () => {
myFunction(myID).then(response => {
if (response['value'] === null) {
setTimeout(getValue);
} else {
// here you know the other service has processed the initial request
}
});
};
首先,我将整个事情包装在一个名为 getValue
的函数中。请注意,此函数仅在 承诺解决后再次调用。 (对 setTimeout
的调用是在不消耗堆栈的情况下使用递归的技巧。)如果这仍然运行得太快,请将 100
左右的附加参数传递给 setTimeout
调用。
或者,您可以像您分享的 link 一样使用 async/await。我不是 async/await 方面的专家,但根据 this and this.
判断,while 循环和 for 循环的工作原理应该相同
您可以使用 await
的异步函数。
我还使用延迟函数来延迟对 myfunction()
的每次调用。
当您收到响应时,您可以中断 while 循环。
const delay = ms => new Promise((resolve, reject) => setTimeout(resolve, ms));
async function main() {
const myID = 1;
let response;
while (true) {
response = await myfunction(myID);
if (response["value"] != null) {
break;
}
await delay(5000);
}
//do Something once you get the response here below:
}
main();
你好,我需要调用一个带有 ID 的 REST 函数,returns React.js 中的一个承诺。该函数在调用时会在某个时候在其响应中包含特定值。在另一个服务处理初始请求之前,此值将为空。
这是我目前所做的:
while(myVariable){
myfunction(myID).then( (response) => {
if(response['value'] != null
myVariable = false;
}
});
}
此代码的问题在于 while 循环被尽可能快地调用,因此完全利用了计算机。因此,我需要一个允许我通过 ID 轮询结果的函数,直到其中一个函数调用的响应包含有效响应为止。
我尝试了以下方法但没有成功,因为我没有固定的运行次数:
谢谢你的问候。
如您所说,问题是 while 循环急切地运行,而不是等待每个承诺都解决。
解决这个问题的一种方法是使用递归。递归使您可以更好地控制何时 'loop' 接下来:
let getValue = () => {
myFunction(myID).then(response => {
if (response['value'] === null) {
setTimeout(getValue);
} else {
// here you know the other service has processed the initial request
}
});
};
首先,我将整个事情包装在一个名为 getValue
的函数中。请注意,此函数仅在 承诺解决后再次调用。 (对 setTimeout
的调用是在不消耗堆栈的情况下使用递归的技巧。)如果这仍然运行得太快,请将 100
左右的附加参数传递给 setTimeout
调用。
或者,您可以像您分享的 link 一样使用 async/await。我不是 async/await 方面的专家,但根据 this and this.
判断,while 循环和 for 循环的工作原理应该相同您可以使用 await
的异步函数。
我还使用延迟函数来延迟对 myfunction()
的每次调用。
当您收到响应时,您可以中断 while 循环。
const delay = ms => new Promise((resolve, reject) => setTimeout(resolve, ms));
async function main() {
const myID = 1;
let response;
while (true) {
response = await myfunction(myID);
if (response["value"] != null) {
break;
}
await delay(5000);
}
//do Something once you get the response here below:
}
main();