Javascript 函数在调用时正常运行,但总是返回未定义的
我目前正在使用react和firebase制作一个注册表单,我一直在通过检查firebase的用户列表来验证用户提供的用户名是否已被使用。以下是我的代码的简化版本:Javascript 函数在调用时正常运行,但总是返回未定义的,javascript,reactjs,firebase,firebase-realtime-database,Javascript,Reactjs,Firebase,Firebase Realtime Database,我目前正在使用react和firebase制作一个注册表单,我一直在通过检查firebase的用户列表来验证用户提供的用户名是否已被使用。以下是我的代码的简化版本: import React, { Component } from 'react'; import * as firebase from 'firebase'; const userList = [] class SignUpForm extends Component { constructor() {
import React, { Component } from 'react';
import * as firebase from 'firebase';
const userList = []
class SignUpForm extends Component {
constructor() {
super();
/*initialize my state*/
}
//get the user list from the database
componentWillMount() {
const users = database.ref('users')
users.once('child_added', snapshot => {
userList.push(snapshot.val())
})
}
/*functions that get username from input and store into the state*/
validateForm() {
//in this.state, 'username' is the text input that the user entered
const { username } = this.state
//this is the function that checks if the username is already in use
const findUsername = (username) => {
userList.map(user => {
if (user.username === username) {
console.log("test")
return true
}
})
}
//if username has been taken
if (findUsername(username)) {
console.log("found the same username in the database")
}
/*other validation checks*/
}
render() {
return(
<div>
{/*input elements, etc*/}
<button onClick={this.validateForm}
</div>
)
}
}
import React,{Component}来自'React';
从“firebase”导入*作为firebase;
const userList=[]
类注册表单扩展组件{
构造函数(){
超级();
/*初始化我的状态*/
}
//从数据库中获取用户列表
组件willmount(){
const users=database.ref(“用户”)
一次('child_added',snapshot=>{
userList.push(snapshot.val())
})
}
/*从输入中获取用户名并存储到状态的函数*/
validateForm(){
//在此.state中,“username”是用户输入的文本输入
const{username}=this.state
//此函数用于检查用户名是否已在使用中
const findUsername=(用户名)=>{
userList.map(用户=>{
如果(user.username==用户名){
控制台日志(“测试”)
返回真值
}
})
}
//如果已使用用户名
如果(findUsername(用户名)){
log(“在数据库中找到相同的用户名”)
}
/*其他验证检查*/
}
render(){
返回(
{/*输入元素等*/}
您的返回true
是从传递给userList.map()
的匿名函数返回的,而不是从函数findUsername返回的。userList.map()
不会从内部匿名函数传播该返回值
如果您想知道userList
数组是否包含一些字符串,我完全不清楚您为什么要使用map()
。在我看来,如果您想要一个布尔值来指示数组是否包含字符串,您应该改为使用:
您的返回true
是从传递给userList.map()
的匿名函数返回的,而不是从函数findUsername返回的。userList.map()
不会从内部匿名函数传播该返回值
如果您想知道userList
数组是否包含一些字符串,我完全不清楚您为什么要使用map()
。在我看来,如果您想要一个布尔值来指示数组是否包含字符串,您应该改为使用:
由于函数不返回任何内容,因此控制台日志未定义。您在映射内返回true,但findUsername本身不返回任何内容。
要检查用户是否存在,只需执行此操作
const hasUser = userList.find(user => user.username === username);
if(!hasUser) {
//no user present. you can proceed further.
}
由于函数不返回任何内容,因此控制台日志未定义。您在映射内返回true,但findUsername本身不返回任何内容。
要检查用户是否存在,只需执行此操作
const hasUser = userList.find(user => user.username === username);
if(!hasUser) {
//no user present. you can proceed further.
}
感谢您的回答,情况确实如此!我使用了.map(),因为userList数组包含具有用户名、电子邮件、姓名、姓氏等属性的对象,我只想选择每个用户的用户名属性,所以我认为使用.map()将是解决方案感谢您的回答,情况确实如此!我使用了.map()由于userList数组包含一组具有用户名、电子邮件、姓名、姓氏等属性的对象,我只想选择每个用户的用户名属性,因此我认为使用.map()将是解决方案