Преобразование обратного вызова события, используя `this`, чтобы обещать перенос контекста - PullRequest
0 голосов
/ 23 ноября 2018

Я использую exif-js для извлечения информации EXIF ​​из изображений камеры / фотогалереи в приложении Ionic 3.Раньше я ловил событие onload и извлекал информацию EXIF ​​в обратном вызове, и теперь я хочу изменить поведение с помощью обещаний, но я не могу заставить его работать, потому что функция, извлекающая информацию 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
        }
      })
    })
  }

Я пробовал несколько вещей, включая передачу resolve в getData с разными аргументами (this, photo ...) без успеха.

Как мне перевезти getData context over to the promise so that getImageEXIFAsync` возвращает данные EXIF?

1 Ответ

0 голосов
/ 23 ноября 2018

То, что вы ищете, это call, apply and bind.

Вы можете найти некоторые объяснения здесь

Что вы хотите сделать:

exif.getData ([ВАШ КОД ЗДЕСЬ]). call (exif)

...