在Javascript中嵌套提取

时间:2017-11-02 22:39:45

标签: javascript es6-promise

我有一些代码使用新的ES6 fetch API并嵌套了提取调用。第一次获取获取一个文档,其中包含一些锚点。而对于每个锚,我做另一个提取。这是代码。

  1. 我进行提取,获取响应文本,将其解析为HTML并将DOM传递给另一个函数。

  2. 我从文档中选择了一些锚点,并且每次检查它是否合适,然后我进行第一次记录。这会记录六个不同的网址。

  3. 现在,我为六个网址中的每个网址执行嵌套提取。代码与第一次获取的代码几乎相同。我只是记录响应URL以确保我有不同的响应。第二次日志记录还显示了6个不同的URL。我再次解析响应文本并将DOM传递给另一个函数。

  4. 现在它变得有趣了。我对DOM做的第一件事就是打印文档URL。这打印相同URL的六倍。为什么它会打印相同网址的六倍,尽管四行之前已记录了六个不同的网址?

  5. 必须有某种副作用,但我不明白它在哪里。我有不同的响应,我为每个响应创建一个新的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;
      });
    

1 个答案:

答案 0 :(得分:-1)

Are nested promises normal in node.js? 我强烈建议您使用async-await。由于async / await,异步代码变得类似于同步,并且在其行为中存在这样的代码的特征,在使用promise的某些情况下非常有用,由于各种原因,不方便。