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

Posted

技术标签:

【中文标题】react在promise中丢失了“this”上下文[重复]【英文标题】:react loses 'this' context inside promise [duplicate] 【发布时间】:2018-06-02 18:12:50 【问题描述】:

我对 react 很陌生,可能犯了一个愚蠢的错误。我正在尝试使用返回承诺的 axios 进行 api 调用。当这个承诺解决时,我想将它的结果传递给一个函数,该函数通过回调更新父级的状态。但是,当我不确定时,“这个”似乎消失了。我想随着它在未来的解决,不再有“这个”上下文?我可以通过将回调分配给临时并使用它来解决它,但感觉很笨拙。代码如下:

axios.get(url)
  .then(function(response) 
    this.props.handler(response.data.thing)
  )
  .catch(function(error) 
    console.log(error)
  )

这行得通:

let handler = this.props.handler
axios.get(url)
  .then(function(response) 
    handler(response.data.word)
  )
  .catch(function(error) 
    console.log(error)
  )

【问题讨论】:

【参考方案1】:

这是箭头函数的用武之地。箭头函数基本上从上面维护this,并且不会在函数内覆盖它。您可以在MDN 上阅读更多信息。请记住,这是一项较新的功能,因此某些较旧的浏览器将不支持它。

以下代码是根据您问题中的代码使用箭头函数的示例。

axios.get(url)
  .then((response) => 
    this.props.handler(response.data.thing)
  )
  .catch((error) => 
    console.log(error)
  )

编辑:

不使用 ES6 语法的另一种方法是在函数外部设置一个变量。即使不支持箭头功能,您在问题中提供的另一个示例也将起作用。但是你也可以使用下面的代码。

var self = this;
axios.get(url)
  .then(function (response) 
    self.props.handler(response.data.thing)
  )
  .catch(function (error) 
    console.log(error)
  )

这将允许您使用创建的变量 (self) 访问正确的 this。当然,如前所述,这样做的缺点是它稍微笨重,不如使用箭头函数那么干净。

有关浏览器与箭头函数兼容性的更多信息,您可以查看Can I use。虽然如果你使用 React,你很有可能会使用 Babel 作为编译器,它应该负责转换 ES6 语法并使其更兼容浏览器。

【讨论】:

是的!谢谢。忘记了他们的一切。也是 es6 的新手。 @user1584120 没问题!如果您认为这有助于您考虑接受答案。很高兴它对您有所帮助! 我会的,你肯定回答得很快,因为它不会让我再接受 3 分钟 @user1584120 哈哈太棒了。很高兴它有帮助!快乐编码!

以上是关于react在promise中丢失了“this”上下文[重复]的主要内容,如果未能解决你的问题,请参考以下文章

React setState 未能捕获被拒绝的 Promise

javascript,promise,如何在 then 范围内访问变量 this [重复]

在React中将函数与Promise链接

从 setState promise 化的探讨 体会 React 团队设计思想

通过调用Local Method响应Vue.js事件总线时丢失上下文

React开发(271):UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated e(