javascript - 那么为什么总是用 undefined 调用呢?
问题描述
我有以下承诺链:
return new Promise((resolve, reject) => {
isUserExists(user.username, user.email).then((existResult) => {
/// already exists
if (existResult.rows[0].exists == true) {
reject('Already exists');
} else {
return insertCity({
city_id: user.city_id,
city_name: user.city_name
});
}
}).then((cityResult) => {
/// this is one is always called even I didn't called insertCity above
console.log(cityResult); /// could be undefined if not called
return insertUser(user); /// I don't want this to be executed
});
});
如果用户已经存在,我调用reject('Already exists')
. 但是无论如何,nextthen
被调用,这意味着insertUser
也被调用。我不希望它发生。我只想reject
在任何时候被调用时停止一切。return reject( Already exists
) 没有帮助。我该如何解决这个问题?看来我不明白 Promises 的核心内容。
解决方案
您的代码中有几个问题:
您不需要包装
isUserExists(user.username, user.email)
在Promise
构造函数中,因为它已经返回一个Promise
.在第一个
.then()
方法的回调函数内部,调用reject()
会拒绝新创建的方法,Promise
但它不会停止执行第一个.then()
方法的回调函数,直到它隐式返回undefined
,然后调用第二个.then()
块。
解决方案
您不需要Promise
构造函数。一旦确定用户已经存在,就可以抛出错误。
return isUserExists(user.username, user.email)
.then((existResult) => {
/// already exists
if (existResult.rows[0].exists == true) {
throw new Error("already exists");
}
return insertCity({ city_id: user.city_id, city_name: user.city_name });
})
.then((cityResult) => {
console.log(cityResult);
return insertUser(user);
});
确保.catch()
在调用代码中添加块以在用户已经存在时处理错误。
推荐阅读
- ms-access - ACCESS VBA Preventing duplicate value creation based on two criteria
- vba - VBA - 在没有驱动器号的服务器上使用目录路径
- fiware - Using Cygnus to write in mongo db with no string
- python-3.x - How to convert Neural network model (.h5) file to spark RDD file in python
- java - 格式 yyyyMMddhhmmss 的 Java 字符串到日期转换错误
- spyder - Spyder: Disable copying when nothing is selected
- json - Llimitation while converting big json into csv in Power Query Editor
- linux - envsubst: default values for unset variables
- java - 有没有办法使用 java 高级客户端删除/更新 ElasticSearch 中的现有别名?
- android - 更改锚点视图的可见性后,CoordinatorLayout 锚点视图位置错误