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