尝试使用Promise

时间:2018-11-06 04:00:03

标签: javascript firebase firebase-realtime-database promise

我不确定这个问题是否太具体。我在更新数据库的函数中使用firebase:

UpdatePeerNotification = (content) => {
        firebase.database().ref('users').child(this.props.match.params.username).
        .update('something)
    }

如果我通常这样称呼它。updatePeerNotification('abc');它正在工作 但是当尝试使用

Promise(this.updatePeerNotification('abc')).then(() => do something)) 

this.updatePeerNotification('abc').then(() => do something))

它引发以下错误: 未处理的拒绝(TypeError):未定义不是承诺

怎么可能定期调用该函数,但是附加.then却得到该错误。另外,刷新页面后,该函数被调用而没有错误

非常感谢!

3 个答案:

答案 0 :(得分:2)

您没有从UpdatePeerNotification返回承诺(或其他任何东西),这导致调用者尝试在then上调用undefined(函数不返回的默认返回值任何值)。

您可能正在寻找返回update()的结果,这是一个承诺,可以在服务器上完成更新时解决:

UpdatePeerNotification = (content) => {
    return firebase.database().ref('users').child(this.props.match.params.username).
        .update('something)
}

答案 1 :(得分:0)

当返回类型为Promise时,您应该使用方法处理拒绝

      updatePeerNotification('abc').then(() => dosomething).catch(function (error){return Promise.reject(error)}))

这应该有帮助。

答案 2 :(得分:0)

每次使用Promise时,您都必须根据自己的情况解决它或拒绝它。处理之后,您只能执行.then。出于调试目的,我个人使用chrome控制台查看承诺状态。因此,我只建议您在以下功能中检查Promise的状态。

UpdatePeerNotification = (content) => {
    return firebase.database().ref('users').child(this.props.match.params.username).
        .update('something)
}
检查承诺状态的一个示例在这里:

var promise1 = new Promise(function(resolve,reject){
  resolve(23);
});

promise1.then(function(value) {
  console.log(value);
  /* expected output: 23
  Promise {<resolved>: undefined}
__proto__: Promise
[[PromiseStatus]]: "resolved"
[[PromiseValue]]: undefined
*/
});