创建可重用的承诺链并将其应用于其他承诺
Create and apply a reusable chain of promises onto other promises
上下文:
我正在使用 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 个承诺,而是可以将那串承诺分配给变量或方法然后应用它吗?例如,
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();
我不确定如何使用纯粹的承诺(当有人找到解决方案时,我将其指定为 "accepted answer")但是...
node-horseman
附带以下功能来创建自定义 horseman promises
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
他们的文档很棒。
您可以通过将 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();
}
此函数将 return 由 close()
函数 return 编辑的内容,如果它是一个 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!')
});
但是我看不出有什么明显的优势。
上下文:
我正在使用 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 个承诺,而是可以将那串承诺分配给变量或方法然后应用它吗?例如,
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();
我不确定如何使用纯粹的承诺(当有人找到解决方案时,我将其指定为 "accepted answer")但是...
node-horseman
附带以下功能来创建自定义 horseman promises
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
他们的文档很棒。
您可以通过将 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();
}
此函数将 return 由 close()
函数 return 编辑的内容,如果它是一个 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!')
});
但是我看不出有什么明显的优势。