【问题标题】:Compacting multiple promises压缩多个承诺
【发布时间】:2018-01-04 19:39:43
【问题描述】:

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

【问题讨论】:

  • 我不认为error => { return error } 像你期望的那样工作。你为什么要在firebase.ref…utils.updateUsernameMapping… 上不带参数地调用.then();?!
  • 只需声明一个作用域链更高的 var 并在第一次调用时分配它。或者,如果您是个顽固分子,请将其与其他值一起返回到一个数组中,然后使用解构来访问它。
  • 请查看this answer 了解有关承诺链的说明...
  • @JaredSmith 不,不要那样做。
  • 感谢@Bergi 我编辑了帖子。

标签: javascript promise es6-promise


【解决方案1】:

对于多个承诺使用

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

Promise.all documentation

【讨论】:

  • 这并没有回答问题,这是关于如何通过一个承诺链线程化一个值。
  • 我不认为 OP 的承诺是相互独立的。
【解决方案2】:

只重新抛出错误的错误处理程序是没有意义的,省略它们。

您可以在最外层使用usernameExist 变量unnest,这是您在其他任何地方都不需要的:

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可以解决这个问题,嵌套闭包就好了。

【讨论】:

  • 感谢您的精彩回答。这正是我一直在寻找的,因为它看起来更整洁。我将重新发布您的答案,并稍作修改。
猜你喜欢
  • 1970-01-01
  • 2015-02-09
  • 1970-01-01
  • 1970-01-01
  • 2017-10-01
  • 2016-10-27
  • 1970-01-01
  • 1970-01-01
  • 2015-12-24
相关资源
最近更新 更多