在尝试创建用户之前,我已经编写了一个事务来检查Firestore中是否存在该用户。
setUserData(uid, email, displayName, photoURL, firstName, lastName, referralId) {
const userRef = this.afs.firestore.collection('users').doc(`${uid}`);
return this.afs.firestore.runTransaction(async (transaction: any) => {
const doc = await transaction.get(userRef);
let userData = {};
if (!doc.exists) {
userData = {
uid: uid,
email: email,
displayName: displayName,
photoURL: photoURL,
emailVerified: true,
firstName: firstName,
lastName: lastName,
referralId: referralId
};
transaction.set(userRef, { userData }, { merge: true }).then(() => {
this.referralService.addUserToWaitlist(referralId);
});
}
}).then(() => {
if (!environment.production) {
console.log(
'Transaction successfully committed.'
);
}
}).catch((error) => {
if (!environment.production) {
console.log('Transaction failed: ', error);
}
});
}但是,我一直收到以下错误:
Transaction failed: TypeError: transaction.set(...).then is not a functiontransaction没有then的等价物吗?
发布于 2019-03-20 23:38:34
这不是在事务中编写文档的方式。由于事务是要么全有要么全无的操作,您不能等待一个set()完成后再继续执行另一个事务,因此它返回一个promise是没有帮助的。对于事务,您必须在函数结束之前对所有文档执行set()操作,然后在函数结束时,事务将尝试将它们全部写入。如果它们不能全部以原子方式编写,您的事务函数将再次运行。
还要注意,用于transaction.set()的普通JavaScript API (不是Angular)被声明为返回相同的事务对象,而不是promise。
https://stackoverflow.com/questions/55264263
复制相似问题