代码之家  ›  专栏  ›  技术社区  ›  user1272965

承诺创造中的“这个”是什么?[复制品]

  •  1
  • user1272965  · 技术社区  · 6 年前

    有一个叫github的包 pngjs-draw 将基本体绘制到PNG上的。这正是我需要的,但我希望它能与其他使用promises的异步代码一起运行。我试图这样做,遇到了一些我不明白的关于“这个”。pngjs从github中绘制示例代码如下所示…

    var fs = require('fs');
    var drawing = require('pngjs-draw');
    var png = drawing(require('pngjs').PNG);
    
    fs.createReadStream("blue.png")
      .pipe(new png({ filterType: 4 }))
      .on('parsed', function() {
        // Draws a pixel with transparent green
        this.drawPixel(150,200, this.colors.black())
        // more examples snipped
        // Writes file
        this.pack().pipe(fs.createWriteStream('blue.out.png'));
      });
    

    它在“parsed”函数中使用“this”,并且 this 似乎是一个拥有所有绘画方法的例子。

    我想做一个更通用的版本,除了返回一个承诺,处理错误,等等。但似乎我不能用同样的方式来创造承诺。这是我的尝试…

    function drawOnPNG(fileIn, fileOut, drawFunction) {
      return new Promise((resolve, reject) => {
          fs.createReadStream(fileIn).pipe(new png({ filterType: 4 })).on('parsed', () => {
              drawFunction(this);  // <--MY PROBLEM, I THINK
              this.pack().pipe(fs.createWriteStream(fileOut)).on('finish', () => resolve()).on('error', error => reject(error));
          }).on('error', error => reject(error));        
      });
    }
    

    我想这样的绘图功能会很方便…

    function someDrawFunction(pngThing) {
        pngThing.drawPixel(150,200, this.colors.black());
    }
    

    然后我可以这样画…

    drawOnPNG('fileIn.png', 'fileOut.png', someDrawFunction).then(...
    

    但是,当这个执行时,pngthing并不是我所希望的。用调试器检查它,它是一个很大的对象,上面似乎定义了所有的js类。你能建议一种方法来访问允诺创建中的绘图对象吗?

    2 回复  |  直到 6 年前
        1
  •  1
  •   Paul    6 年前

    你的问题与改用承诺无关。它是从一个常规函数切换到一个箭头函数,用于回调到“parsed”事件。箭头函数没有自己的 this . 解决办法是转换 () => 回到 function () { 并添加相应的 } 回来。

        2
  •  2
  •   SLaks    6 年前

    .on() 正在用一些特定的 this (可能是png对象)。

    使用箭头函数继承 从它的词法范围,而不是callsite,所以您忽略了这一点 .

    你应该用普通的 function() {} 所以你拿起 从调用站点传递。