Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.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 第二个异步函数依赖于第一个异步函数_Javascript_Node.js - Fatal编程技术网

Javascript 第二个异步函数依赖于第一个异步函数

Javascript 第二个异步函数依赖于第一个异步函数,javascript,node.js,Javascript,Node.js,在async/await/Promissions上尝试和查看每一个可能的页面两天后,我仍然无法让它工作 第二个等待b取决于第一个a的结果。无论我做什么,b都将返回未定义。我已经通过日志记录验证了firstLink是否返回了正确的href。然而,代码通过b向右吹 我使用node.js,因为代码是从服务器上运行的。因为它没有运行浏览器,所以我使用JSDOM来模拟dom 谢谢 async function getData(url){ const a = await fetchReq(url)

在async/await/Promissions上尝试和查看每一个可能的页面两天后,我仍然无法让它工作

第二个等待
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提示符会返回“{}”,我认为这仍然是一个未解决的承诺。

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

返回承诺的已实现值,如果不是承诺,则返回值本身

如下所示:

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

我希望这有帮助

好的,有两个问题

  • 似乎是将const JSDOM移到main函数中,只返回它生成的文本,这样我就可以返回第二个fetch请求

  • 对于nodeJS,似乎您需要的是文本内容,而不是内部文本

     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)
    

  • 这是新的JSDOM(文本)是否真的返回承诺?如果不是简单地删除
    等待
    并返回
    返回新的JSDOM(文本)。还需要等待响应。text()是unnecessary@ambianBeing我相信,在取消了那里的等待之后,它仍在发挥同样的作用。VS代码有下划线,表示它对这种类型的表达式没有影响。是的,好的!但是,为什么要等待非异步(并且不返回承诺)的东西呢。你能试试控制台的
    response.text()
    is和
    newjsdom(text)
    的返回值吗?我相信在删除wait之后,它仍然可以正常工作。VS代码在下面加了下划线,表示它对这种类型的表达式没有影响。
    JSDOM
    究竟是什么类型的返回?这是一个
    承诺吗
    ?我在OP中添加了一条评论。我很难看到它返回什么,因为我只能通过cmd查看node.js中的日志。当我记录'b'时,返回了'{}'。我无法记录dom是什么。根据使用wait from'const b=wait fetchReq()'的性质,我相信它确实返回了一个承诺?@Citanaf我相信是这样的。