私は以下の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)
})
},
私は 'error => { return error }'とは思っていません。なぜ 'firebase.ref ...'と 'utils.updateUsernameMapping ...'に引数を付けずに '.then();'を呼び出すのですか? – Bergi
varを上位にしてスコープチェーンを宣言し、最初の呼び出しでそれを割り当てます。またはあなたのスティックであれば、他の値を持つ配列でそれを返し、それにアクセスするために非構造化を使用します。 –
約束の連鎖を明確にするには、[この回答](https://stackoverflow.com/a/35805818/7564182)をチェックしてください。 – Myonara