.then 异步函数中的 React-Native 调用函数

Posted

技术标签:

【中文标题】.then 异步函数中的 React-Native 调用函数【英文标题】:React-Native call function inside .then async function 【发布时间】:2017-07-20 06:31:09 【问题描述】:

我试图在用户拍照后调用一个函数。我尝试通过以下方式这样做:

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));

图像路径被记录,没有错误发生。

【问题讨论】:

【参考方案1】:

您需要使用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,因为您需要使用箭头函数或在构造函数中使用binddoSomething 绑定到类。第三种选择是使用装饰器通过 Babel 自动绑定方法。

祝你好运!

【讨论】:

【参考方案2】:
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);
  

【讨论】:

以上是关于.then 异步函数中的 React-Native 调用函数的主要内容,如果未能解决你的问题,请参考以下文章

在 utils.js 文件(React-Native)中调用异步函数?

react-native fetch 中的 'then(res => res.json())' 是啥意思? [复制]

从异步函数 react-native 获取未定义

从异步函数react-native获取未定义

新异步函数中的异步函数[重复]

关于defer.promise.then 异步的一个疑问