使用 `this` 将事件回调转换为承诺携带上下文

Posted

技术标签:

【中文标题】使用 `this` 将事件回调转换为承诺携带上下文【英文标题】:Convert event callback using `this` to promise carrying context 【发布时间】:2019-04-26 00:57:42 【问题描述】:

我正在使用 exif-js 从 Ionic 3 应用程序中的相机/照片库图像中提取 EXIF 信息。我曾经捕获onload 事件并在回调中检索EXIF 信息,现在我想通过使用promises 来更改行为,但我无法使其工作,因为检索EXIF 信息的函数使用this 而我没有'不明白如何让 Promise 上下文可以访问它。

这是我的旧代码:

public getImageEXIF(imagePath) 
    let imageR = new Image();
    imageR.onload = function () 
      exif.getData(imageR, function () 
        const allMetaData = exif.getAllTags(this);
      );
    ;
    imageR.src = imagePath;
  

违规行是const allMetaData = exif.getAllTags(this);,其中this 包含用EXIF 数据丰富的图像副本。

这就是我将函数转换为异步的方式:

 public waitImageLoad(imagePath): Promise<any> 
    return new Promise((resolve) => 
      let photo = new Image();
      photo.onload = () => resolve(photo)
      photo.src = imagePath;
    );
  

public getImageEXIFAsync(imagePath) 
    this.waitImageLoad(imagePath).then((photo) => 
      exif.getData(photo, () => 
        // Here `this` points to the class to which `getImageEXIFAsync` belongs to
        const allMetaData = exif.getAllTags(this);
        console.log(lat, long);

        if (lat && long) 
          return  latitude: lat, longitude: long 
         else 
          return null
        
      )
    )
  

我尝试了几件事,包括使用不同的参数(thisphoto...)将 resolve 传递给 getData,但均未成功。

如何携带getDatacontext over to the promise so thatgetImageEXIFAsync`返回EXIF数据?

【问题讨论】:

在回调函数中指的是什么?也许你可以 decalare 一个 baribale 类似 let _this = objectYouWant,然后将 _this 传递给 getAllTags 方法 【参考方案1】:

你要找的是call, apply and bind

You can find some explanation here

你想做的是:

exif.getData([您的代码]).call(exif)

【讨论】:

以上是关于使用 `this` 将事件回调转换为承诺携带上下文的主要内容,如果未能解决你的问题,请参考以下文章

如何将回调转换为承诺? [复制]

OpenLayers RenderComplete 事件回调在回调中使用此上下文

当 `this` 不可用时,从拖动回调中检索 DOM 目标

react在promise中丢失了“this”上下文[重复]

节点无错误退出且不等待承诺(事件回调)

解决一堆承诺时出现 Firebase 错误:无法将未定义或 null 转换为对象