我有以下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
})
}
但是,我认为由于嵌套级别, signUp 功能难以破译。我尝试将其更改为以下方法:
userPromise
.then()
.then()
.then();
但我无法让它工作,因为用户变量需要传递给链。理想情况下,我希望最小化此代码的可读性,并使用一个 catch()来提高效率。任何想法都赞赏。
更新:根据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 :(得分:2)
只是重新抛出错误的错误处理程序是没有意义的,省略它们。
您可以unnest使用您在其他地方不需要的usernameExist
变量的最外层:
signUp (data) {
return oneFunction(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);
});
}
嵌套then
没有任何问题,确保最终返回user
。有a few approaches来解决这个问题,嵌套闭包很好。
答案 1 :(得分:0)
对于多个承诺使用
p1 = new Promise();
p2 = new Promise();
p3 = new Promise();
Promise.all([p1, p2, p3])