Node JS:While循环检查状态直到获取成功

NodeJS : While loop check the status untill sucess in fetch

我有以下代码调用 api 并使用 node-fetch 获取状态。我需要使用 node-fetch 2.6.1 并使用类似 .then-->.then 的代码无法使用 async await .

function fetching(){
 fetch(jobsurl, requestOptions)
    .then(response => response.text())
    .then(result => {
        
        console.log("------------the job id is ------------"); 
        console.log(eval(result)[0]["id"])
        console.log("\n\n\n\n\n")
        console.log("--------------The Job Status is------------");
        console.log(eval(result)[0]["status"])
        console.log("\n\n\n\n\n")
        var job_id=eval(result)[0]["id"].toString();
        var stat=eval(result)[0]["status"];

       while(stat != "success"){
           
         fetch(jobsurl, requestOptions)
           .then(response => response.text())
           .then(result => {
               console.log("------------the job id is ------------"); 
               console.log(eval(result)[0]["id"])
               console.log("\n\n\n\n\n")
               console.log("--------------The Job Status is------------");
               console.log(eval(result)[0]["status"])
               console.log("\n\n\n\n\n")
               job_id=eval(result)[0]["id"].toString();
               stat=eval(result)[0]["status"];
            }
           // as it is success so call the main url
           fetch()....             

           }//ftehcing end

现在它在 then 中有 stat 变量,它给出作业状态成功或待定,如果成功则只有我可以继续。但是为此,我需要迭代并检查每次何时会成功。所以我使用了 while 循环。

但它不起作用。每次通过在其中调用 fetch 来检查统计值。

请推荐

这里是对您的代码的 async/await 修改,它使循环变得非常简单。

还有

  • 正确的错误处理(使用response.ok
  • 不使用 evalresponse.json() 应该做你想做的事
  • 请求之间的延迟(以免服务器以毫秒为单位发送垃圾邮件)
function delay(number) {
  return new Promise(resolve => setTimeout(resolve, number));
}

async function fetching() {
  while (true) {
    const response = await fetch(jobsurl, requestOptions);
    if (!response.ok) {
      throw new Error(`HTTP error, status = ${response.status}`);
    }
    const results = await response.json();
    const {id, status} = results[0];
    console.log(`Job ${id} status: ${status}`);
    if (status === 'success') {
      break;
    }
    await delay(500);  // Wait for a bit before re-requesting
  }
  // Call main url..?
}

编辑:如果你绝对不能使用async/await,你需要使用递归函数,像这样,而且很难读。

function delay(number) {
  return new Promise((resolve) => setTimeout(resolve, number));
}

function fetching() {
  function _recursive() {
    return fetch(jobsurl, requestOptions)
      .then(response => {
        if (!response.ok) {
          throw new Error(`HTTP error, status = ${response.status}`);
        }
        return response.json();
      })
      .then(results => {
        const {id, status} = results[0];
        console.log(`Job ${id} status: ${status}`);
        if (status === 'success') {
          return results;
        }
        return delay(500).then(_recursive);
      });
  }
  return _recursive();
}

function main() {
  fetching().then(results => {
    console.log(results);
    // call main URL..?
  });
}