2017-07-28 7 views
0

私は以下の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

私は 'error => { return error }'とは思っていません。なぜ 'firebase.ref ...'と 'utils.updateUsernameMapping ...'に引数を付けずに '.then();'を呼び出すのですか? – Bergi

+0

varを上位にしてスコープチェーンを宣言し、最初の呼び出しでそれを割り当てます。またはあなたのスティックであれば、他の値を持つ配列でそれを返し、それにアクセスするために非構造化を使用します。 –

+0

約束の連鎖を明確にするには、[この回答](https://stackoverflow.com/a/35805818/7564182)をチェックしてください。 – Myonara

答えて

0

はちょうど再スロー

p1 = new Promise(); p2 = new Promise(); p3 = new Promise(); Promise.all([p1, p2, p3])

Promise.all documentation

+1

これは、プロミスチェーンを通じて値をスレッド化する方法に関する質問には答えません。 –

+0

私はOPの約束が互いに独立しているとは思わない。 – mhodges

2

エラーハンドラを使用しますエラーは無意味なので、省略してください。

あなたはどこか他の必要はありませんusernameExist変数と最も外側のレベルunnestすることができます:userが最後に返されることを保証し、ネストされたthenと間違って何もない

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); 
    }); 
} 

を。この問題に対処するにはa few approachesがあります。入れ子のクロージャは問題ありません。

+0

すばらしい答えをありがとう。これはちょうど私が多くのneaterのように見ていたものです。私はいくつかの小さな変更を加えてあなたの答えを再投稿します。 – londonfed

関連する問題