1

Node.JS で NightmareJS v2 と Vo を使用して、いくつかの検索用語を調べて、それらからデータを収集しようとしています。私のコードは以下の通りです:

const nightmare = require('nightmare'),
  vo = require('vo'),
  nbot = nightmare({ title: 'Bot',
                        show: true });

const searchTerms = ['spacex', 'tesla', 'elon musk', 'hyperloop']; // EXAMPLE SEARCH TERMS

vo(run)(function(err) {
  if (err) throw err
});

function * run() {
  yield nbot.goto('http://google.com');

  yield * forEach(searchTerms, gen);

  yield nbot.end()
  .then(function(result) {
    console.log(result) // STUFF SHOULD BE LOGGED HERE
  });
}

function * gen(item) {
  yield nbot.wait('input[title="Search"]')
            .click('input[title="Search"]')
            .type('input[title="Search"]', item)
            .click('input[name="btnK"]')
            .wait(100)
            .screenshot(item + '.png')
            .insert('input[title="Search"]', '')
            .evaluate(function() {
              return 'foobar' // STUFF RETURNED HERE
            })
}

function * forEach (arr, fn) { // NEEDED BECAUSE FOREACH DOESN'T WORK IN GENERATORS
  let i;
  for (i = 0; i < arr.length; i++) {
    yield * fn(arr[i]);
  }
}

NightmareJS のドキュメントによると、 の中に何かを返すとevaluate、 を使用すると吐き出されますthen。これを試してみると、未定義になります。ジェネレーターに問題があると思いますが、私はそれらに慣れていないのでわかりません。助けていただければ幸いです。

4

2 に答える 2

3

例はcloseですが、ジェネレーターと Promise 構文を混在させて一致させているようです。メソッドは.evaluate()説明どおりに動作しますが、vo(またはco)を使用している場合.then()は、処理および管理され、定義されている場合.then()は式の左側に値が返されます。yieldまた、価値のあることとして、ジェネレーターは値を返さないため、(正しく) を取得しundefinedます。

これvoは、イテレータ、ジェネレータ、promise、および/についてもう少し詳しく説明しますconightmare-examplesのドキュメントも参照してくださいvo

最後に、 から までの結果を返すように変更されgenforEachrun:

const nightmare = require('nightmare'),
  vo = require('vo'),
  nbot = nightmare({
    title: 'Bot',
    show: true
  });

const searchTerms = ['spacex', 'tesla', 'elon musk', 'hyperloop']; // EXAMPLE SEARCH TERMS

vo(run)(function(err) {
  if (err) throw err
});

function* run() {
  yield nbot.goto('http://google.com');

  var results = yield * forEach(searchTerms, gen);
  console.log(results);
  yield nbot.end();
}

function* gen(item) {
  var value = yield nbot.wait('input[title="Search"]')
    .click('input[title="Search"]')
    .type('input[title="Search"]', item)
    .click('input[name="btnK"]')
    .wait(100)
    .screenshot(item + '.png')
    .insert('input[title="Search"]', '')
    .evaluate(function() {
      return 'foobar' // STUFF RETURNED HERE
    });

  return value;
}

function* forEach(arr, fn) { // NEEDED BECAUSE FOREACH DOESN'T WORK IN GENERATORS
  let i;
  var results = [];
  for (i = 0; i < arr.length; i++) {
    results.push(yield * fn(arr[i]));
  }
  return results;
}
于 2016-06-02T02:52:22.460 に答える