Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/430.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vue.js/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 通过Vue计算调用Vue方法时出现问题_Javascript_Vue.js_Vuejs2 - Fatal编程技术网

Javascript 通过Vue计算调用Vue方法时出现问题

Javascript 通过Vue计算调用Vue方法时出现问题,javascript,vue.js,vuejs2,Javascript,Vue.js,Vuejs2,我相信这个问题通常与JS有关,而不是VueJS。但是我有下面的Vue方法,它返回Firebase调用并返回请求的对象。这是有效的: methods: { getSponsor (key) { db.ref('businesses').child(key).on('value', snap => { console.log(snap.val()) return snap.val() }) } } [对象] 现在,当我从计算属性调用此方法时,它

我相信这个问题通常与JS有关,而不是VueJS。但是我有下面的Vue方法,它返回Firebase调用并返回请求的对象。这是有效的:

methods: {
  getSponsor (key) {
    db.ref('businesses').child(key).on('value', snap => {
      console.log(snap.val())
      return snap.val()
    })
  }
}
[对象]

现在,当我从计算属性调用此方法时,它会导致
未定义

computed: {
  sponsor () {
    console.log(this.getSponsor(key))
    return(this.getSponsor(key))
  }
}
未定义


为什么会这样?这是因为我如何返回我的方法吗?

当您调用异步操作时,您将从函数上下文中退出,这意味着您无法从回调函数返回将在主函数中返回的值

问题的解决方案是从回调函数中设置
数据中的一个属性(首先声明它),然后在计算属性中获取该属性的值

 computed: {
    sponsor () {
        return(this.sponsor)
    }
 }
 methods: {
  getSponsor (key) {
    let self = this;
    db.ref('businesses').child(key).on('value', snap => {
      console.log(snap.val())
      self.sponsor =  snap.val()
    })
  }
 }
如果在计算属性中调用
getSonsor
,它将运行两次,一次在初始化过程中,一次在
发起人
属性更改时运行


因为我猜您只需要运行一次,或者在事件中运行一次,所以您可以在
beforCreate
/
mounted
等上运行它。。根据您的需要

get赞助商
不返回任何内容。它只是执行一些异步代码。啊,有道理。所以为了修复它,我需要将
getspor
中的代码转换成一个函数并返回该函数?抱歉,我对JS的理解有点不够。太棒了,我将其移动到
挂载
,并在Vue实例上声明了
数据
,它可以工作。非常感谢。次要nit:此时的计算属性是多余的。否则,我喜欢它@BertEvans您是对的,但可能他想对值进行转换,
发起人
计算的值实际上会导致“超出最大调用堆栈大小”错误,因为它正在返回自身。