第二个异步功能取决于第一个

时间:2020-01-05 16:49:34

标签: javascript node.js

经过两天的尝试,并在async / await / promises上查看了每个可能的页面后,我仍然无法使它工作。

第二个等待b取决于第一个a的结果。无论我做什么,b都将返回未定义状态。通过登录firstLink确实返回了正确的href进行了验证。但是,该代码会被b炸掉。

我正在使用node.js,因为代码是从服务器运行的。因为它没有运行浏览器,所以我使用JSDOM模拟dom。

谢谢

async function getData(url){

    const a = await fetchReq(url)

    var firstLink = a.window.document.getElementsByTagName('a')[0].href;

    const b = await fetchReq(firstLink)

    myStr = b.window.document.getElementsByTagName('a')[1].innerText;

    return myStr

}

async function fetchReq(url){
    const response = await fetch(url);
    const text = await response.text();
    const dom = new JSDOM(text);
    return dom;
};

getData(url)

注意:通常,我不确定调试此代码的最佳方法。我看到结果的唯一方法是将其记录到cmd。因此,将“ b”登录到cmd提示符将返回“ {}”,我认为这仍然是一个未解决的承诺。

2 个答案:

答案 0 :(得分:1)

我猜您需要在fetchReq语句的return函数内部删除await。发生此问题是因为它返回了Promise的已实现值,并且您的代码中await有2个JSDOM关键字。如文档所述:

返回承诺的实现价值,或者返回不是Promise的价值本身。

就像下面这样:

async function fetchReq(url){
    const response = await fetch(url);
    const text = await response.text();
    const dom = new JSDOM(text);
    return dom;
};

希望对您有帮助!

答案 1 :(得分:0)

好的,所以有两个问题。

  1. 似乎将const JSDOM移到主函数中,并且仅返回文本,因此我可以返回第二个提取请求。

  2. 对于nodeJS,似乎您需要textContent,而不是innerText ...

     async function getData(url){
          const a = await fetchReq(url)
          const dom1 = new JSDOM(a);
          var firstLink = dom1.window.document.getElementsByTagName('a')[0].href;
          const b = await fetchReq(firstLink)
          const dom2 = new JSDOM(b);
          myStr = dom2.window.document.getElementsByTagName('a')[1].textContent;
          return myStr
      }
    
     async function fetchReq(url){
           const response = await fetch(url);
           const text = await response.text();
           return text;
     };
    
     getData(url)