Firebase回调中无法识别异步功能

时间:2018-11-07 21:33:56

标签: javascript firebase react-native async-await expo

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为未定义

所以,现在我不明白为什么函数未定义。

1 个答案:

答案 0 :(得分:1)

这是因为您使用的是老式的匿名函数,其中this的行为略有不同。如果您将.then()内部的回调切换为ES6 lambda,它将正常工作,因为this将引用父上下文。