如何使用nodejs child_process exec来使用es6

时间:2016-01-27 11:39:23

标签: node.js exec child-process es6-promise

我有一个phantomjs脚本,它在命令行参数中使用url并返回stdout中的body html内容。

当我通过使用phantomjs脚本的promise调用接收html内容时,我调用parsePage()来通过cheerio然后使用gatherNext()来操作数据。

let cmd = '/usr/local/bin/phantomjs ' + __dirname + '/phantom.js';

let child = (command) => {
    return exec(command)
        .then(result => {
            return result.stdout;
        });
};

let parsePage = (result) => {

    debug('stdout %s', result);

    var $ = cheerio.load(result); 
    // logic - page crawl data & will 've data as array of objects

   return resultArray
};   

let gatherNext = (products) => {
  debug('products %j', products);
  allProducts = allProducts.concat(products);

  if(/*not hasNextPage*/) {
  return allProducts;
  }
  else {
  return Promise.resolve(cmd + ' ' + data.productLink + '&page=' + page).then(child)// this.parse({url: `&page=${page}`})
      .then(parsePage)
      .then(gatherNext);
  }
};

debug('parsing page by page');

return Promise.resolve(cmd + ' ' + data.productLink + '&page=' + page).then(child).then(parsePage).then(gatherNext);

但我无法宣传exec功能?我怎样才能实现这一目标?

编辑:

我发现了这个lib:github.com/sindresorhus/execa解决了承诺问题,但我得到了另一个问题。对于每个下一页(即,页面 - 分页2,3,4,5等),子函数承诺总是为所有下一页返回旧的(第一页的html内容)。为什么在这种情况下会发生这种情况?任何想法?

这里修改了以下代码:

let child = (pager) => {
        let command = cmdBase + pager;
        console.log('command: ', command);
        return execa.shell(command).then(result => {
            return result.stdout;
        });
    };

或者,更好的解决方案?

谢谢!

0 个答案:

没有答案