Кошмарный цикл

Здравствуйте, я пишу приложение, в котором мне нужно иметь возможность перебирать массив URL-адресов. Я знаю, что есть пример того, как это сделать, но моя проблема немного отличается, я объясню с помощью некоторого кода.

nightmare
  .goto('some url')
  .evaluate(() => {
    //evaluate code
  })
  .then(dataArray => {
    var innerRun = function* () {
      var returnData = [];
      for (var i = 0; i < dataArray.length; i++) {
        var item = dataArray[i];
        yield nightmare
          .goto(item.url)
          .evaluate(function () {
            return false;
          })
          .screenshot(item.imgPath)
        returnData.push(item);
      }
      return returnData;
    }
    vo(innerRun)(function (err, ads) {
      if (err) {
        console.log("Error running", err)
        return;
      }
    });
  });

Я хотел бы иметь возможность зацикливать этот код, используя массив URL-адресов. У меня были проблемы с реализацией этого, я полагаю, потому что я уже делаю это внутри then. Он перестанет работать, как только попадет в yield nightmare внутри then.

var mainLoop = function* () {
  for (var j = 0; j < urlArray.length; j++) {
    var url = urlArray[j];
    yield nightmare.goto(url)//same code as in example above
  }
}

vo(mainLoop)(function (err, d) {
  if (err) {
    console.log("Error running", err)
    return;
  }
});

Приведенный выше код - это то, что я пытался сделать. Если у кого-то есть какие-либо идеи, это было бы огромной помощью, спасибо!


person rpascal    schedule 03.12.2017    source источник
comment
Каковы ваши требования для выполнения всех этих запросов? Вы хотите запустить их последовательно, один за другим. Столько параллельно, сколько практично? Все параллельно? И каков желаемый конечный результат? Массив снимков? Что вы хотите сделать, если вы получите ошибку по пути - остановиться и сообщить об ошибке, пропустить ошибку и продолжить другие?   -  person jfriend00    schedule 04.12.2017
comment
Если возможно, я хотел бы запустить как можно больше параллельно. Я думал, что вам нужно делать это один за другим из-за экземпляра кошмара, но если бы их можно было запускать параллельно, это было бы здорово. Конечным результатом является сохранение моментальных снимков и регистрация массива innerData, возвращаемого vo(innerRun). Если есть ошибка, я хотел бы зарегистрировать эту ошибку, но продолжайте.   -  person rpascal    schedule 04.12.2017


Ответы (1)


Может быть, попробуйте это:

var urls = ['http://example.com', 'http://example2.com', 'http://example3.com'];

var results = [];
urls.forEach(function(url) {
  nightmare.goto(url)
    .wait('body')
    .title()
    .then(function(result) {
      results.push(result);
    });
});
console.dir(results)

Источник: https://github.com/rosshinkley/nightmare-examples/blob/master/docs/common-pitfalls/async-operations-loops.md

person Neto A    schedule 12.12.2017