Я хочу получить все данные в концерте после запуска nightmare.js, но я продолжаю получать концерт не определен - PullRequest
0 голосов
/ 25 апреля 2019

Я хочу получить все данные в концерте после запуска nightmare.js, но я продолжаю получать данные не определены

const Nightmare = require('nightmare');
    const nightmare = Nightmare({show: true});

    nightmare
      .goto('https://www.nairaland.com/romance')
      .wait(1000)
      .evaluate(function(){
        var gig = [];
        var links = document.querySelectorAll('a');
        links.forEach(function(result){
            gig.push(result.innerHTML)
        })
        return gig;
      })
      .end()
      .then(function(result){
       gig.forEach(function(result){
        console.log(gig)
       })
      })
      .catch(error => {
        console.error('The Error is', error)
      })

Ответы [ 2 ]

0 голосов
/ 25 апреля 2019

Вы объявили переменную gig внутри области функции, которая передана в evaluate().Переменная видна для кода внутри функции, в которой она была объявлена, включая другие вложенные функции, определенные в той же области видимости, но она не видна для кода, который находится во внешних областях функций.

Чтобы решить эту проблему, объявите переменную var gig=[]; перед вызовом nightmare.goto(....

. Эта переменная помещается во внешнюю область видимости, где она будет видна всем более глубоко вложенным функциям.,Думайте о функциях как о панели одностороннего зеркального стекла.Вы можете видеть из функции, глядя на переменные во внешнем мире, но внешний мир не может заглянуть в вашу функцию, чтобы увидеть ее внутренние переменные.

0 голосов
/ 25 апреля 2019

Ваша декларация gig = [] входит в сферу вашей оценочной функции. Когда эта функция возвращается, она выходит за рамки видимости.

Поместите это во внешнюю область. Может быть, так?

const gig = [];
nightmare
  .goto('https://www.nairaland.com/romance')
  .wait(1000)
  .evaluate(function(){
    const links = document.querySelectorAll('a');
    links.forEach(function(result){
...
...