我有以下JavaScript承诺链。它按预期工作。压缩多个承诺
signUp (data) {
return oneFunction(username).then((usernameExist) => {
return firebaseAuth.createUserWithEmailAndPassword(data.email, data.password).then((user) => {
firebaseDb.ref('users/' + user.uid + '/public/').set(userData).then()
utils.updateUsernameMapping(data.username, user.uid).then()
return user.updateProfile({
displayName: data.displayName
}).then(function() {
return user
}, error => {
throw error
})
})
}).catch(error => {
throw error
})
}
不过,我相信注册功能是困难的,因为嵌套层次的破译。我试图将其更改为以下方法:
userPromise
.then()
.then()
.then();
但由于用户变量需要向下传递链条我无法得到它的工作。理想情况下,为了提高可读性,我想尽量减少此代码,并使用一个catch()。任何想法赞赏。
UPDATE:在从BERGI反馈,下面是我更新的代码:
signUp (email, password, displayName, username) {
const userData = { username: username, lastLogin: Firebase.database.ServerValue.TIMESTAMP }
return utils.checkIfUserExists(username).then(usernameExist => {
return firebaseAuth.createUserWithEmailAndPassword(email, password)
}).then(user => {
return Promise.all([
firebaseDb.ref('users/' + user.uid + '/public/').set(userData),
utils.updateUsernameMapping(username, user.uid),
user.updateProfile({displayName})
]).then(() => user)
})
},
'我不认为'错误=> {0}返回错误 }'正如你所期望的那样工作。你为什么要在'firebase.ref ...'和'utils.updateUsernameMapping ...'上调用'.then();'没有参数?'! – Bergi
只需在范围链上声明一个var,并在第一次调用时分配它。或者,如果你是一个坚持者,用一个数组将其返回,并使用解构来访问它。 –
请检查[本回答](https://stackoverflow.com/a/35805818/7564182)澄清承诺链接... – Myonara