Реактивная функция вызова внутри асинхронной функции.then

Я пытаюсь вызвать функцию после того, как пользователь сделал снимок. Я пытаюсь сделать это следующим образом:

export default class LA extends Component {
    constructor(props) {
      super(props);
      this.doSomething = this.doSomething.bind(this);
    }


    takePicture() {
      this.camera.capture()
      .then(function(data) {
        doSomething(data.path); //THIS CAUSES THE RUNTIME ERROR
      })
     .catch(err => console.error("error: " + err));
    }

    doSomething(imgPath) {
      console.log(imgPath);
    }


}

И я получаю следующую ошибку при съемке:

Ошибка: Ссылка Ошибка: doSomething не определен

Однако, если я заменю takePicture() на:

takePicture() {
  this.camera.capture()
  .then(function(data) {
    console.log(data.path);
  })
 .catch(err => console.error("error: " + err));
}

Путь к изображению регистрируется, и ошибки не возникает.

2 ответа

Решение

Вам нужно использовать this для того, чтобы вызвать функцию-член. Вот рабочий пример:

export default class LA extends Component {
  constructor(props) {
    super(props);
    this.doSomething = this.doSomething.bind(this);
  }


  takePicture() {
    this.camera.capture()
    .then((data) => {
      this.doSomething(data.path);
    })
   .catch(err => console.error("error: " + err));
  }

  doSomething(imgPath) {
    console.log(imgPath);
  }


}

Обратите внимание, что я использовал функцию стрелки для ссылки на правильный this внутри обратного вызова.

Или вы можете также передать функцию напрямую, как это.

  takePicture() {
    this.camera.capture()
      .then(this.doSomething)
      .catch(err => console.error("error: " + err));
  }

Тем не менее, последний подход не будет работать doSomething на правильную область, для этого вам нужно будет связать doSomething в класс, используя функцию стрелки или в конструкторе, используя bind, Третий вариант - использовать декоратор для автоматической привязки метода с помощью Babel.

Удачи!

export default class LA extends Component {

  ...


  takePicture1() {
    this.camera.capture()
    .then((data) => {
      this.doSomething(data.path);   // CORRECT
      // keyword `this` represents instance of class LA
    })
   .catch(err => console.error("error: " + err));
  }


  takePicture2() {
    this.camera.capture()
    .then(function (data) {
      this.doSomething(data.path); // WRONG
      // function defines `this` as the global object 
      // (because it's where the function is executed)
    })
   .catch(err => console.error("error: " + err));
  }

  doSomething(imgPath) {
    console.log(imgPath);
  }
}
Другие вопросы по тегам