重复调用 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();