我有一个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;
});
};
或者,更好的解决方案?
谢谢!