经过两天的尝试,并在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提示符将返回“ {}”,我认为这仍然是一个未解决的承诺。
答案 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)
好的,所以有两个问题。
似乎将const JSDOM移到主函数中,并且仅返回文本,因此我可以返回第二个提取请求。
对于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)