蓝鸟承诺 - 嵌套与拒绝模式

时间:2015-03-15 16:40:35

标签: javascript mongoose promise bluebird

我正在开发一个我们正在使用promises的应用。我试图找出更好的模式是什么。

打破了因素之间的关注,如果出现错误则拒绝承诺。然后在catch块中处理拒绝。或者在catch块中throw新类型的错误和句柄是否更好?

Account.findOneAsync({email: request.payload.email})
  .then(function (user) {
    if (user) {
      return user.compareHash(request.payload.password);
    } else {
      // Account not found
      return Bpromise.reject('AccountNotFound');
    }
  })
  .then(function (validPassword) {
    if (validPassword) {
      return request.auth.jwt.user.sign();
    } else {
      // Invalid password
      return Bpromise.reject('InvalidPassword');
    }
  })
  .then(function (jwt) {
    var response = reply.success();
    return response.header('authorization', jwt);
  })
  .catch(function (e) {
    if (e === 'AccountNotFound' || e === 'Invalid Password') {
      return reply(Boom.unauthorized('Invalid username/password'));
    } else {
      // Perhaps log something like unhandled error
      return reply(Boom.unauthorized('Invalid username/password'));
    }
  });

或者嵌套有希望的。我觉得这只是在“回调地狱”的同一个兔洞里。

Account.findOneAsync({email: request.payload.email})
      .then(function (user) {
        if (user) {
          user.compareHash(request.payload.password)
            .then(function (valid) {
              if (valid) {
                request.server.plugins.jwt.sign()
                  .then(function (jwt) {
                    var response = reply.success();
                    return response.header('authorization', jwt);
                  });
              } else {
                // Invalid password
                return reply(Boom.unauthorized('Invalid username/password'));
              }
            });
        } else {
          // Account not found
          return reply(Boom.unauthorized('Invalid username/password'));
        }
      })
      .catch(function (e) {
        console.log(e);
      });

1 个答案:

答案 0 :(得分:2)

我认为你可以通过投掷然后抓住你的繁荣物品来获得两全其美。

两种方法中缺少的一件事是,当你已经在then处理程序中时,惯用的事情是抛出错误而不是创建并返回被拒绝的承诺。在else声明之后,您也不需要return阻止:

Account.findOneAsync({email: request.payload.email})
  .then(function (user) {
    if (user) {
      return user.compareHash(request.payload.password);
    }
    // Account not found
    throw Boom.unauthorized('Invalid username/password');
  })
  .then(function (validPassword) {
    if (validPassword) {
      return request.auth.jwt.user.sign();
    }
    // Invalid password
    throw Boom.unauthorized('Invalid username/password');
  })
  .then(function (jwt) {
    var response = reply.success();
    return response.header('authorization', jwt);
  })
  .catch(function (e) {
    if (e.isBoom) {
      return reply(e);
    }
    // Perhaps log something like unhandled error
    return reply(Boom.unauthorized('Invalid username/password'));
  });