我正在寻找一种更简单/更简单的方法来创建错误功能,我只是在寻找一种简单的方法来退出承诺链。您可以在下面看到错误对象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)
并且不必有一个无用的一次性错误类。
答案 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对象来代替处理错误。