2017-07-28 51 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

'我不認爲'錯誤=> {0}返回錯誤 }'正如你所期望的那樣工作。你爲什麼要在'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

錯誤處理程序,只是重新拋出錯誤是毫無意義的,省略它們。

可以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來解決這個問題,嵌套關閉就好了。

+0

感謝您的一個很好的答案。這正是我期待的看起來很整齊。我會通過一些小修改重新發布您的答案。 – londonfed