【发布时间】:2018-01-04 19:39:43
【问题描述】:
我有以下 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)
})
},
【问题讨论】:
-
我不认为
error => { return error }像你期望的那样工作。你为什么要在firebase.ref…和utils.updateUsernameMapping…上不带参数地调用.then();?! -
只需声明一个作用域链更高的 var 并在第一次调用时分配它。或者,如果您是个顽固分子,请将其与其他值一起返回到一个数组中,然后使用解构来访问它。
-
请查看this answer 了解有关承诺链的说明...
-
@JaredSmith 不,不要那样做。
-
感谢@Bergi 我编辑了帖子。
标签: javascript promise es6-promise