2016-11-25 80 views
0

为什么我得到错误:Uncaught ReferenceError: writeUserData is not defined(…)为什么我的功能无法识别我的其他功能?

或其他错误,当我包括this.writeUserData是:Cannot read property 'writeUserData' of undefined

功能仍然张贴正确的数据,以火力那么为什么抱怨? 等等,那么在另一个函数中调用函数的正确方法是什么。我认为这是正确的做法吗?

signUserUp(){ 
    let name = this.state.nameValue; 
    let slackName = this.state.slackNameValue; 
    let email = this.state.emailValue; 
    let password = this.state.passwordValue; 
    firebase.auth().createUserWithEmailAndPassword(email, password).then(
     function(result){ 
     writeUserData(name, result.uid, email, slackName); 
     }, 
     function(error){ 
     let errorCode = error.code; 
     let errorMessage = error.message; 
     console.log(errorMessage, '***'); 
     console.log(errorCode, 'code'); 
     }); 
    }; 

    writeUserData(name, useruid, email, slackName){ 
     firebase.database().ref('/pairs/' + useruid).set({ 
     name: name, 
     useruid: useruid, 
     email: email, 
     slackName: slackName 
     }); 
    } 

编辑:此代码是用ES6语法阵营组件内...

回答

1

对于你的第一个问题:原因是你没有宣布writeUserData的功能。

下面是一个类似于Alexey Soshin的答案,但有一个替代语法。

var signUserUp = function() { 
 
    let name = this.state.nameValue; 
 
    let slackName = this.state.slackNameValue; 
 
    let email = this.state.emailValue; 
 
    let password = this.state.passwordValue; 
 

 
    firebase.auth().createUserWithEmailAndPassword(email, password).then(
 
    function(result){ 
 
     writeUserData(name, result.uid, email, slackName); 
 
    }, 
 
    function(error){ 
 
     let errorCode = error.code; 
 
     let errorMessage = error.message; 
 
     console.log(errorMessage, '***'); 
 
     console.log(errorCode, 'code'); 
 
    }); 
 
}; 
 

 
var writeUserData = function (name, useruid, email, slackName) { 
 
    firebase.database().ref('/pairs/' + useruid).set({ 
 
     name: name, 
 
     useruid: useruid, 
 
     email: email, 
 
     slackName: slackName 
 
    }); 
 
}

关于第二个问题( “...当我包括this.writeUserData ... Cannot read property 'writeUserData' of undefined”):在这种情况下this是不确定的。

要为第二个问题定义this,您必须在this内定义您的writeUserData

定义writeUserDatathis

  1. 添加它的父函数的原型

    signUserUp.prototype.writeUserData = function(name, useruid, email, slackName) { ... } 
    
  2. 绑定父功能子功能

    firebase.auth().createUserWithEmailAndPassword(email, password).then(...).bind(this); 
    
  3. this
  4. 绑定子功能的this你的功能

    function(result) { ... }.bind(this), 
    

...这是尴尬。所以这是第一种方式!:)

var signUserUp = function() { 
 
    let name = this.state.nameValue; 
 
    let slackName = this.state.slackNameValue; 
 
    let email = this.state.emailValue; 
 
    let password = this.state.passwordValue; 
 

 
    signUserUp.prototype.writeUserData = function(name, useruid, email, slackName) { 
 
    firebase.database().ref('/pairs/' + useruid).set({ 
 
     name: name, 
 
     useruid: useruid, 
 
     email: email, 
 
     slackName: slackName 
 
    }); 
 
    } 
 

 
    firebase.auth().createUserWithEmailAndPassword(email, password).then(
 
    function(result) { 
 
     this.writeUserData(name, result.uid, email, slackName); 
 
    }.bind(this), 
 
    function(error) { 
 
     let errorCode = error.code; 
 
     let errorMessage = error.message; 
 
     console.log(errorMessage, '***'); 
 
     console.log(errorCode, 'code'); 
 
    }).bind(this); 
 
};

+0

我在React组件中声明了它,这是ES6声明函数的方法吗? –

+0

但是你没有使用关键字'功能'权利? –

+0

嗯......它看起来像你在考虑ES6类(https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Classes)。我需要更多地阅读...... –

2

你只需要把它声明为一个函数:

function writeUserData(name, useruid, email, slackName){...}; 

你认为它成功仅仅是因为createUserWithEmailAndPassword()创建你的用户,并且只有在这之后调用成功处理程序。

但这却从未在你的情况下执行:

firebase.database().ref('/pairs/' + useruid).set 
+0

但我使用ES6的语法是正确的正确方式宣布其为阵营组件内? –