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

时间:2017-06-24 03:35:19

标签: javascript node.js promise es6-promise node-horseman

上下文

我使用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();

2 个答案:

答案 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

他们的文档摇滚。