我有一些代码使用新的ES6 fetch
API并嵌套了提取调用。第一次获取获取一个文档,其中包含一些锚点。而对于每个锚,我做另一个提取。这是代码。
我进行提取,获取响应文本,将其解析为HTML并将DOM传递给另一个函数。
我从文档中选择了一些锚点,并且每次检查它是否合适,然后我进行第一次记录。这会记录六个不同的网址。
现在,我为六个网址中的每个网址执行嵌套提取。代码与第一次获取的代码几乎相同。我只是记录响应URL以确保我有不同的响应。第二次日志记录还显示了6个不同的URL。我再次解析响应文本并将DOM传递给另一个函数。
现在它变得有趣了。我对DOM做的第一件事就是打印文档URL。这打印相同URL的六倍。为什么它会打印相同网址的六倍,尽管四行之前已记录了六个不同的网址?
必须有某种副作用,但我不明白它在哪里。我有不同的响应,我为每个响应创建一个新的DOM解析器。怎么会有副作用?
// 1.
fetch('https://eu.battle.net/d3/de/item/two-handed/')
.then(response => response.text())
.then(text => (new DOMParser()).parseFromString (text, 'text/html'))
.then(doc => {
// 2.
let urls = [];
doc.querySelectorAll('li.open a')
.forEach(node => {
if (!node.href.match(/flail|mighty-weapon|scythe/g)) {
console.log ("1: " + node.href); // Prints 6 different URLs.
// 3.
fetch(node.href)
.then(response => {
console.log ("2: " + response.url); // Prints 6 different URLs.
return response.text()
})
.then(text => (new DOMParser()).parseFromString (text, 'text/html'))
.then(doc => {
// 4.
console.log ("3: " + doc.URL); // Prints first URL six times.
doc.querySelectorAll('.top .ui-pagination a')
.forEach(node => {
urls.push(node.href);
});
});
}
});
return urls;
});
答案 0 :(得分:-1)
Are nested promises normal in node.js? 我强烈建议您使用async-await。由于async / await,异步代码变得类似于同步,并且在其行为中存在这样的代码的特征,在使用promise的某些情况下非常有用,由于各种原因,不方便。