我正在尝试拨打
DELETE
电话,并且正在实现下面的功能。我知道在承诺中,需要有“解决”和“拒绝”状态,但我收到了未处理的承诺拒绝错误:
UnhandledPromiseRejectionWarning:未处理的 Promise 拒绝(拒绝 id:1):[object Object]
我不太喜欢在承诺中使用条件语句,因为它会变得混乱,但我在这里想做的是检查组织是否经过验证,如果是,则不应发生删除操作并将拒绝。
function deleteOrg(id) {
return new Promise((resolve, reject) => {
// A helper function that returns an 'org' object
findById(id)
.then((orgObject) => {
if (orgObject.verified_at !== null) {
throw new Error(422, 'Unable to delete organization')
}
//Organization is not verified, so proceed to delete
new Organization().where({'id': id}).destroy()
.then(() => {
return resolve() //return 200 upon deletion
})
.catch((err) => {
return reject(new Error(500, 'Unable to delete organization'))
})
})
.catch((err) => {
const m = `Unable to delete organization: ${err.message}`
return reject(new Error(500, m))
})
})
}
我很确定我在
if
中处理拒绝的方式是错误的。
由于 findById 和 .destroy 返回 Promises,因此不需要 Promsie 构造函数
您的代码将被简化为
function deleteOrg(id) {
return findById(id)
.then((orgObject) => {
if (orgObject.verified_at !== null) {
throw new Error(422, 'Unable to delete organization')
}
//Organization is not verified, so proceed to delete
return new Organization().where({'id': id}).destroy()
.catch((err) => {
throw (new Error(500, `Unable to delete organization: ${err.message}`));
});
});
}
在 Promise 构造函数中创建 Promise 是一种已知的反模式。尝试将您的承诺模块化为单独的函数:
function deleteOrg(id) {
const verifyOrg = (orgObject) => {
if (orgObject.verified_at !== null) {
throw new Error(422, 'Unable to delete organization')
}
};
const destroyOrg = () => new Organization().where({
'id': id
}).destroy();
return findById(id)
.then(verifyOrg)
.then(destroyOrg);
}
您可以让错误通过 Promise 链传播并在外部处理它们:
deleteOrg(id)
.catch((err) => {
const m = `Unable to delete organization: ${err.message}`;
// ...
});
original method() => {
try{ //code to raise the exceptio
})
;
最好的处理方式是使用
expect
可以匹配异常。样本测试
someMock.mockFunc(() => {
throw new Error("Something");
});
test('MockFunc in error', () => {
return expect(orginalCall()).rejects.toMatch('Something');
});
我实际上遇到了同样的问题,因为我未能将
return
关键字添加到调用方法(deleteOrg(id))。添加 return
UnhandledPromiseRejectionWarning 后消失了。
function deleteOrg(id)
{
// actually returns a promise
}
return deleteOrg.then((result) => {
//code logic after deleting the record//
});