我使用node-horseman
进行网页搜索。情况是,在每次操作后我都会使无头浏览器占用,我通常希望看到结果。
运行
可以看到结果horseman
.open('http://www.google.com')
.html()
.then((html)=>{
return new Promise((resolve, reject)=>{
console.log(html);
fs.writeFile("result.html", html)
resolve();
})
})
.screenshot("result.png")
.close();
创建将html写入result.html
并将呈现页面的屏幕截图写入result.png
。
而不是复制粘贴4个promise的字符串,是否可以将该字符串的promises分配给变量或方法然后应用它?如,
horseman
.open('http://www.google.com')
.preview_result()
哪里
function preview_result(){
return html()
.then((html)=>{
return new Promise((resolve, reject)=>{
console.log(html);
fs.writeFile("result.html", html)
resolve();
})
})
.screenshot("test.png")
.close();
}
或
var preview_result =
html()
.then((html)=>{
return new Promise((resolve, reject)=>{
console.log(html);
fs.writeFile("result.html", html)
resolve();
})
})
.screenshot("test.png")
.close();
答案 0 :(得分:1)
您可以通过将Promise作为输入来定义可重用函数:
function previewResult(openedUrl){
return openedUrl
.html()
.then((html)=>{
return new Promise((resolve, reject)=>{
console.log(html);
fs.writeFile("result.html", html, (error) => { // This way Promise will resolve only after the file was written
if(error) {
reject();
return;
}
resolve();
});
})
})
.screenshot("test.png")
.close();
}
此函数将返回close()
函数返回的内容,如果是Promise,则可以继续使用Promise链。
你可以这样使用它:
const openedUrl = horseman.open('http://www.google.com');
previewResult(openedUrl)
.then(() => { // Note that it will work only if close() returns a Promise
console.log('all done!')
});
另一种方法是使用apply:
function previewResult(){
return this
.html()
.then((html)=>{
return new Promise((resolve, reject)=>{
console.log(html);
fs.writeFile("result.html", html, (error) => { // This way Promise will resolve only after the file was written
if(error) {
reject();
return;
}
resolve();
});
})
})
.screenshot("test.png")
.close();
}
const openedUrl = horseman.open('http://www.google.com');
previewResult.apply(openedUrl)
.then(() => { // Note that it will work only if close() returns a Promise
console.log('all done!')
});
但我认为没有任何明显的优势。
答案 1 :(得分:0)
我不确定如何使用纯粹的承诺(我将指定为#34;接受的答案"当有人找到解决方案时)但是......
node-horseman
附带以下功能来创建自定义骑士承诺
Horseman.registerAction('preview', function(results_path) {
// The function will be called with the Horseman instance as this
var self = this;
// Return the horseman chain, or any Promise
return this
.html()
.then((html)=>{
return new Promise((resolve, reject)=>{
console.log("html written");
fs.writeFile(results_path+".html", html)
resolve();
})
})
.screenshot(results_path+".png")
});
这导致以下操作符合要求:
horseman
.open('http://www.google.com')
.preview()
.close()
参考:https://github.com/johntitus/node-horseman
他们的文档摇滚。