node.js - 使用 throw-catch 打破承诺链
问题描述
我需要检查用户是否存在于两个数据库中,如果不存在,我必须创建一个新用户。
检查用户是否存在于数据库中 1. 如果存在,则抛出“用户存在”并捕获它,而不执行其他 then() 的其余部分。
检查用户是否存在于数据库中 2. 如果存在,则抛出“用户存在”并捕获它,而不执行其他 then() 的其余部分。
否则,如果它不存在,则创建用户。
我试图打破承诺链。这是场景。所以我所做的是
const promise = new Promise((resolve, reject) => {
resolve(false);
}).then(value => {
//check if user exists in table 1 and set value to True or False
if (value==True){
throw "User exists";
}
else{
return value;
}
}).then(value=> {
////check if user exists in table 2 and set value to True or False
if (value==True){
throw "User exists";
}
else{
return value;
}
}).catch(err => {
console.log(err);
});
这就是它的外观。
但即使我抛出一条消息,它也不会停止执行后面的 then() 语句。即使找到用户,它也会继续执行整个代码。
它还显示以下内容并停止整个执行。
throw 'user found'
^
注意:在我得到用户值之后,我必须处理它们。所以不应该停止执行。
解决方案
而不是 throw 使用return Promise.reject(new Error())
. 顺便说一句 - 如果你扔你应该throw new Error('message')
。
但这应该是处理错误的方式,而不是代码执行的逻辑。
checkIfUserExistsInDB1() //this must be a function returning a promise
.then(user => {
if (!user) return checkIfUserExistsInDB2() //this must be a function returning a promise
else return Promise.resolve(user)
})
.then(user => {
if (!user) return createUser() //this must be a function returning a promise
else return Promise.resolve(user)
})
.then(user=> { do whatever you need more })
.catch(err => { handle error })
推荐阅读
- hy - HyLang import_buffer_to_ast 删除版本 0.18.0
- c# - 如果数组有两个相同的条目,则在 C# 中从 char 数组转换为字符串的问题
- postgresql - 使用 Postgres + Firestore 实现 RBAC
- android - Android Studio:服务管理器的模拟器错误
- java - 如何解决库根依赖的gradle依赖冲突?
- json - 在下一个函数写入文件之前,如何让一个函数打开文件,写入文件然后关闭文件?
- c++ - 有没有办法在编译时获取函数参数名称?
- git - Strapi 定制工作流程和 CI/CD
- javascript - 如何从
- python - Sparkml 使用新数据进行预测会给出 ArrayIndexOutOfBoundsException