【发布时间】:2020-10-22 08:49:52
【问题描述】:
我遇到了一个非常奇怪的错误。有时,当我提交表单时,“userId”cookie 不会更新。我想我已经把这个问题隔离出来了
return user.set({
roomId: roomId,
name: name
}).then(() => alert("finished writing"))
当 cookie 未更新时,永远不会调用“完成写入”警报。我认为这与未解决的承诺有关,并且占用了线程,因此 .then 永远不会运行(因此带有 cookie 更新的 .then 永远不会运行)。但是,我不太了解承诺,也找不到可能阻碍它的原因。如果有人可以帮助我或指出错误,将不胜感激。代码如下:
function GamePage() {
const {roomId} = useParams();
const db = firebase.firestore();
let history = useHistory();
const [userIdExistsButWrongRoom, setUserIdExistsButWrongRoom] = useState(true);
const userId = cookies.get('userId');
useEffect(() => {
if(!(typeof(userId)==="undefined")){
db.collection("users").doc(userId).get().then(function(doc){
if(doc.data().roomId === roomId){
setUserIdExistsButWrongRoom(false);
}
});
}
}, [db,roomId,userId]);
if(cookies.get('roomId')===roomId){
if(typeof(userId)==="undefined"){
return (
<div>
<EnterName />
</div>
);
} else {
if(userIdExistsButWrongRoom){
return (
<div>
<EnterName />
</div>
);
} else {
return (
<div>
<Game />
</div>);
}
}
} else {
history.push("/");
return (<div />);
}
}
function EnterName() {
const {roomId} = useParams();
const [name, setName] = useState("");
function handleChange(event) {
setName(event.target.value);
}
function handleSubmit(event) {
addNewUser(roomId,name).then(function(userId) {cookies.set('userId',userId)});
}
return (<form onSubmit={handleSubmit}>
<label>
Name:
<textarea value={name} onChange={handleChange} />
</label>
<input type="submit" value="Submit" />
</form>);
}
function Game() {
const {roomId} = useParams();
return (<div>
<h1>
{roomId}
</h1>
</div>);
}
//Add a new user with server generated unique ID, and the given room ID to the database
//Returns the doc
function addNewUser(roomId,name) {
const db = firebase.firestore();
const user = db.collection("users").doc()
const userId = user.id;
alert(userId);
return user.set({
roomId: roomId,
name: name
}).then(() => alert("finished writing"));
}
编辑
在Oliver's answer 之后,我尝试实现一个异步提交处理程序。但是,这导致 addNewUser 函数甚至没有被调用。我发现了这个问题javascript async await Submitting a form with onsubmit using Promise,这表明异步 submitHandler 的问题在于它总是返回一个 Promise,因此它在 Promise 解决之前提交。我尝试实施他们提出的修复方案(如下),但现在又回到了原来的问题,但现在一直都是!
function EnterName() {
const {roomId} = useParams();
const [name, setName] = useState("");
function handleChange(event) {
setName(event.target.value);
}
async function handleSubmit(event) {
let userId = await addNewUser(roomId, name);
alert("test");
cookies.set('userId',userId);
}
function submit(event){
handleSubmit(event);
return false;
}
return (<form onSubmit={submit}>
<label>
Name:
<textarea value={name} onChange={handleChange} />
</label>
<input type="submit" value="Submit" />
</form>);
}
function Game() {
const {roomId} = useParams();
return (<div>
<h1>
{roomId}
</h1>
</div>);
}
//Add a new user with server generated unique ID, and the given room ID to the database
//Returns the doc
async function addNewUser(roomId,name) {
const db = firebase.firestore();
const user = db.collection("users").doc()
const userId = user.id;
alert(userId);
return user.set({
roomId: roomId,
name: name
}).then(() => {
alert("finished writing");
return userId;
});
}
【问题讨论】:
标签: javascript reactjs firebase google-cloud-firestore promise