压缩多个承诺

时间:2017-07-28 16:38:11

标签: javascript promise es6-promise

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

但是,我认为由于嵌套级别, signUp 功能难以破译。我尝试将其更改为以下方法:

userPromise
.then()
.then()
.then();

但我无法让它工作,因为用户变量需要传递给链。理想情况下,我希望最小化此代码的可读性,并使用一个 catch()来提高效率。任何想法都赞赏。

更新:根据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)
  })
},

2 个答案:

答案 0 :(得分: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来解决这个问题,嵌套闭包很好。

答案 1 :(得分:0)

对于多个承诺使用

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

Promise.all documentation