Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在https node.js中使用while循环_Javascript_Node.js_While Loop_Async Await_Try Catch - Fatal编程技术网

Javascript 如何在https node.js中使用while循环

Javascript 如何在https node.js中使用while循环,javascript,node.js,while-loop,async-await,try-catch,Javascript,Node.js,While Loop,Async Await,Try Catch,因此,我要做的是继续尝试获取数据检查我想要的值是否存在如果它不存在,它将返回一个错误,然后重新执行操作,直到值确实存在。 到目前为止,我只有https电话 test = async() => { console.log("Hellow") now = new Date(); const https = require("https"); https.get("website",{ agent: proxyy },

因此,我要做的是继续尝试获取数据检查我想要的值是否存在如果它不存在,它将返回一个错误,然后重新执行操作,直到值确实存在。 到目前为止,我只有https电话

test = async() => {
  console.log("Hellow")
  now = new Date();
  const https = require("https");
  https.get("website",{ agent: proxyy },
    (res) => {
      var body = "";
      res.on("data", function (chunk) {
        body += chunk;
      });
      res.on("end", function () {
        var resp = JSON.parse(body);
        data_wanted = resp.data
        const desiredItem = data_wanted.find((item) =>
          item.name.includes("data")
        );
        console.log(desiredItem)
      });
    }
  );
};
我做了什么但没有成功

while (flag = true ){
  let flag = false 
  try{
  await test()// test is the same function above
}catch(e){
  flag = true
}
}

因此try-catch不会捕获任何错误,因此标志不会变为true,while循环也不会因为某些原因单独工作


EDIT1所以我认为发生了什么,因为https是异步的,try/catch在https调用完成之前运行。

我认为您忘记了在查找“数据”后抛出错误。 也许你需要这样的东西

const desiredItem = data_wanted.find((item) =>
      item.name.includes("data")
 ); 
if (!desiredItem) throw Error('data not found');
return desiredItem
_execute = async () => {
  try {
   await test()
  } catch(e) {
    await _execute()
  }

}
在execute函数中,您可以使用try-catch,或者类似这样的函数

const desiredItem = data_wanted.find((item) =>
      item.name.includes("data")
 ); 
if (!desiredItem) throw Error('data not found');
return desiredItem
_execute = async () => {
  try {
   await test()
  } catch(e) {
    await _execute()
  }

}
并调用_executefunc

return _execute();
您还忘记了在https.get上添加wait,您需要这样做

await https.get()
这段代码永远不会记录任何内容,因为异步调用结果仅在主线程空闲时执行。 我会推荐你,更多信息请看这篇文章。 在讨论解决方案时,您可以在setInterval中传递函数,如果找到值,则检查该函数的结果,而不是清除间隔。 如果你需要密码,请告诉我。 下面是代码,我认为它没有经过优化,是正确的方法,但应该可以工作

interval = setInterval(test,1000) //  set interval for 1 sec function would be hoisted
async function test(){
 console.log("Hello")
  now = new Date();
  https.get("website",{ agent: proxyy },
    (res) => {
      var body = "";
      res.on("data", function (chunk) {
        body += chunk;
      });
      res.on("end", function () {
        var resp = JSON.parse(body);
        data_wanted = resp.data
        const desiredItem = data_wanted.find((item) =>
          item.name.includes("data")
        );
        console.log(desiredItem)
      });
    }
  );
    if(desiredItem)
        clearInterval(interval)
}
如果在获得此结果后需要执行其他操作,则可以在If语句中发出一个事件,并在代码中侦听该事件。
这个,你必须做。检查nodejs中的事件发射器类。

接受的答案是一个聪明的答案,只是想给出我的答案,因为它更容易理解

test2 = async() => {
  console.log("Hellow")
  
  now = new Date();
 res =  await https.get("website",
  // { agent: proxyy },
    (res) => {
      // console.log(res)
      var body = "";
      res.on("data", function (chunk) {
        body += chunk;
      });
      res.on("end", function () {
        var resp = JSON.parse(body);
        data_wanted = resp

       
        const desiredItem2 = data_wanted.find((item) =>
          item.name.includes("data")
        );
      
       try{
        console.log(desiredItem2)
      }catch(e){
        console.log("couldnt find the id")
        test2()
      }
      });
    }
  )
}

如果有可能分享代码,那将是一个了不起的代码在那里检查它,有趣的是我在完全工作之前做了它,但我忘了怎么做:p