A有一段代码正在尝试将用户登录到Firebase,并且完成身份验证后,我想使用Expo注册该用户以进行推送通知。
我的代码如下:
import React, { Component } from 'react';
import { StyleSheet, Text, View, AsyncStorage } from "react-native";
import { Container, Content, Form, Input, Item, Button, Label } from 'native-base'
import * as firebase from 'firebase';
import { Permissions, Notifications } from 'expo';
export default class Login extends React.Component {
constructor(props){
super(props)
this.state = ({
email: '',
password: ''
})
}
registerForPushNotificationsAsync = async (user) => {
// Here I have few Expo related 'await' operations returning notification token from expo
}
// ...........
loginUser = (email, password) => {
try{
firebase.auth().signInWithEmailAndPassword(email, password).then(function(user){
this.registerForPushNotificationsAsync(user);
})
}
catch(error){
console.log(error.toString())
}
}
render() {
return (
<Container style={styles.container}>
<Form>
// .......
<Button style={{marginTop: 10}}
full
rounded
success
onPress={()=>this.loginUser(this.state.email, this.state.password)}
>
<Text style={styles.inputButtonsText}>Login</Text>
</Button>
// ......
</Form>
</Container>
);
}
}
很直截了当发生了什么以及预期发生了什么,但是由于某种原因,当我在代码中达到这一点时:
this.registerForPushNotificationsAsync(user);
我收到一条错误消息: this.registerForPushNotificationsAsync不是一个函数。 (在this.registerForPushNotificationsAsync(user)中,this.registerForPushNotificationsAsync为未定义)
所以,现在我不明白为什么函数未定义。
答案 0 :(得分:1)
这是因为您使用的是老式的匿名函数,其中this
的行为略有不同。如果您将.then()
内部的回调切换为ES6 lambda,它将正常工作,因为this
将引用父上下文。