开发者问题收集

Firebase 回调中无法识别异步函数

2018-11-07
207

我有一段代码试图将用户登录到 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个回答

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

Kai
2018-11-07