创建可重用的承诺链并将其应用于其他承诺

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!')
   });

但是我看不出有什么明显的优势。