简体   繁体   English

如何在 nodejs 中向我的函数添加异步/等待?

[英]How to add async/await to my functions in nodejs?

I tried to make the code asynchronous but I couldn't.我试图使代码异步,但我做不到。 What i need to do?我需要做什么? This is my functions:这是我的功能:

1. 1.

router.post('/urls', (req, response) => {
  count = 2;
  webUrl = req.body.url;
  depth = req.body.depth;
  letstart(webUrl, response);
});
function letstart(urlLink, response) {
  request(urlLink, function (error, res, body) {
    console.error('error:', error); // Print the error if one occurred
    console.log('statusCode:', res && res.statusCode); // Print the response status code if a response was received
    //console.log('body:', body); // Print the HTML for the Google homepage.
    if (!error) {
     getLinks(body);
      if (!ifFinishAll) {
       GetinsideLinks(linkslinst, response);
      }
      else {
        console.log("Finish crawl");
      }
    }
    else {
      console.log("sorry");
      return "sorry";
    }
  });
}
function GetinsideLinks(list, response) {
  count++;
  if (count <= depth) {
    for (let i = 0; i < list.length; i++) {
      const link = list[i].toString();
      var includeUrl = link.includes(webUrl);
      if (!includeUrl) {
        request(link, function (error, res, body) {
          console.error('error2:', error); // Print the error if one occurred
          console.log('statusCode2:', res && res.statusCode); // Print the response status code if a response was received
          if (!error) {
            getLinks(body);
          }
          else {
            console.log("sorry2");
          }
        });
      }
    }
    ifFinishAll = true;
  }
  else {
    console.log("finish");
    ifFinishAll = true;
    response.status(200).send(resArray);
  };
  return resArray;
}
function getLinks(body) {
  const html = body;
  const $ = cheerio.load(html);
  const linkObjects = $('a');
  const links = [];
  linkObjects.each((index, element) => {
    countLinks = linkObjects.length;
    var strHref = $(element).attr('href');
    var strText = $(element).text();
    var existUrl = linkslinst.includes(strHref);
    var existText = textslist.includes(strText);
    if (strText !== '' && strText !== "" && strText !== null && strHref !== '' && strHref !== "" && strHref !== null && strHref !== undefined && !existUrl && !existText) {
      var tel = strHref.startsWith("tel");
      var mail = strHref.startsWith("mailto");
      var linkInStart = isUrlValid(strHref);
      if (!tel && !mail) {
        if (linkInStart) {
          links.push({
            text: $(element).text(), // get the text
            href: $(element).attr('href'), // get the href attribute
          });
          linkslinst.push($(element).attr('href'));
          textslist.push($(element).text());
        }
        else {
          links.push({
            text: $(element).text(), // get the text
            href: webUrl.toString() + $(element).attr('href'), // get the href attribute
          });
          linkslinst.push(webUrl.toString() + $(element).attr('href'))
          textslist.push($(element).text());
        }
      }
    }
  });
  const result = [];
  const map = new Map();
  for (const item of links) {
    if (!map.has(item.text)) {
      map.set(item.text, true);    // set any value to Map
      result.push({
        text: item.text,
        href: item.href
      });
    }
  }
  if (result.length > 0) {
    resArray.push({ list: result, depth: count - 1 });
  }
  console.log('res', resArray);
  return resArray;
}

I want to return/response finally to the "resArray".我想最终返回/响应“resArray”。 I tried to add async and await to function number 1 and number 2 but it didn't succeed.我尝试将 async 和 await 添加到 function 1 号和 2 号,但没有成功。 Maybe I need to add async/await to all functions?也许我需要将 async/await 添加到所有功能? How can I fix that?我该如何解决?

You can achieve your goal by using async-await .您可以通过使用async-await来实现您的目标。

An async function is a function declared with the async keyword, and the await keyword is permitted within them.异步 function 是使用 async 关键字声明的 function ,其中允许使用 await 关键字。 The async and await keywords enable asynchronous, promise-based behavior to be written in a cleaner style, avoiding the need to explicitly configure promise chains. async 和 await 关键字能够以更简洁的方式编写基于承诺的异步行为,从而避免显式配置 promise 链的需要。

Basic example:基本示例:

 function resolveImmediately() { return new Promise(resolve => { resolve(true); }); } function resolveAfter2Seconds() { return new Promise(resolve => { setTimeout(() => { resolve('resolved'); }, 2000); }); } async function asyncCall() { console.log('calling'); const result = await resolveImmediately(); console.log(result); if(result) { const anotherResult = await resolveAfter2Seconds(); console.log(anotherResult); } } asyncCall();


Note: Your code is too long to debug.注意:您的代码太长,无法调试。 As a result, to make you understand about the approach (what & how to do), i have added a simple example into my answer.因此,为了让您了解该方法(做什么和如何做),我在我的答案中添加了一个简单的示例。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM