使用自定义错误退出/中断承诺

时间:2016-03-18 02:28:53

标签: javascript promise bluebird

我正在寻找一种更简单/更简单的方法来创建错误功能,我只是在寻找一种简单的方法来退出承诺链。您可以在下面看到错误对象NoUserFound和承诺链。我正在寻找的期望结果是当model.readUserAddresses返回false时,我抛出一个特定的错误来跳过承诺链。是否有更简单直接(单行)的方法来为此目的创建NoUserFound自定义错误?

function NoUserFound(value) {
   Error.captureStackTrace(this);
   this.value = value;
   this.name = "NoUserFound";
}
NoUserFound.prototype = Object.create(Error.prototype);

model.readUserAddresses(email)
  .then(ifFalseThrow(NoUserFound))
  .then(prepDbCustomer)
  .then(shopify.customerCreate)
  .catch(NoUserFound, () => false)

理想情况下,我可以做这样的事情。

model.readUserAddresses(email)
  .then(ifFalseThrow('NoUserFound'))
  .then(prepDbCustomer)
  .then(shopify.customerCreate)
  .catch('NoUserFound', () => false)

并且不必有一个无用的一次性错误类。

2 个答案:

答案 0 :(得分:2)

如果您不想构建自己的错误类,也可以使用Bluebird's builtin error types之一,即OperationalError

model.readUserAddresses(email)
  .then(ifFalseThrow(Promise.OperationalError))
  .then(prepDbCustomer)
  .then(shopify.customerCreate)
  .error(() => false)

如果这不符合您的需求(例如,因为OperationalError已用于其他内容),您实际上根本不必将其设为自定义错误类型(子类) 。 catch也采用普通的谓词函数,所以你可以像

那样
model.readUserAddresses(email)
  .then(ifFalseThrow(Error, "noUserFound"))
  .then(prepDbCustomer)
  .then(shopify.customerCreate)
  .catch(e => e.message == "noUserFound", () => false)

最后但并非最不重要的一点是,如果您想要的只是跳过链条的一部分,抛出异常并不是最好的主意。而是明确分支:

model.readUserAddresses(email)
  .then(userAddresses =>
     userAddresses
       ? prepDbCustomer(userAddresses)
         .then(shopify.customerCreate)
       : false
  )

(并自行决定缩短该回调,例如.then(u => u && prepDbCustomer(u).then(shopify.customerCreate))

答案 1 :(得分:1)

我试过了。

model.readUserAddresses(email)
.then((status) => {
    if(!status) {
        var error = new Error('No user Found');
        error.customMessage = 'customMessage';
        error.name = 'customeName';
        throw error;
    }
})
.then(prepDbCustomer)
.then(shopify.customerCreate)
.catch((err) {
    console.log(err);
})

我建议创建一个customeError对象来代替处理错误。