我有以下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