return 不会终止 promise/then 链
return does not terminate a promise/then chain
我有以下用于注册用户的代码。
const pgp = require('pg-promise')();
const crypto = require('./crypto.js');
const db = pgp(connection);
const querySelect = (text, params) => {
const s = pgp.as.format(text, params);
return db.any(s)
.then(data => {
return data;
})
.catch(error => {
return error;
});
}
const queryInsert = (text, params) => {
const s = pgp.as.format(text, params);
return db.one(s)
.then(data => {
return data;
})
.catch(error => {
return error;
});
}
const signup = (user) => {
return new Promise((resolved, rejeted)=>{
return querySelect('select username from user WHERE username = ', [user.username])
.then(res => {
if (res.length == 0) {
return true;
}
return resolved(false); //SHOULD STOP + RETURN HERE
})
.then(hashPasswordRes=>{
return crypto.hashPassword(user.password);
})
.then(queryRes=>{
if (queryRes) {
return queryInsert('insert into user (username,password) values (,) RETURNING id',
[user.username, user.password]);
} else {
return rejeted('error while signup');
}
})
.then(res=>{
resolved(true);
})
.catch(error => {
return rejeted('error while signup');
});// catch
}) //promise
};//signup
exports.signup = signup;
这基本上就是整个文件。我猜很简单。
问题是,在我评论 SHOULD STOP + RETURN HERE
的地方,它确实 return false
(这意味着已经是一个现有的用户名,就像插入的用户名一样)
但执行从未停止,因此用户最终保存在数据库中(即使执行了 return resolved(false);
)。
我在这里做错了什么?这曾经在我只有 pg module in my code. When I used pg-promise 时有效,但它开始出现此问题。
坦率地说,我不知道为什么 "return" 也没有停止函数执行。请指教
(node 8.11.1, express 4.16.3, pg 7.4.2, pg-promise 8.4.4)
谢谢
编辑
郑重声明,这是没有 pg-promise 的同一个文件,它工作得很好。
vars 名称发生变化,但您可以看到逻辑。我尝试使用与 pg-promise
相同的逻辑
const crypto = require('./crypto.js');
const {Client} = require('pg');
const getuser = (mail, client) => {
return new Promise((resolved, rejeted)=>{
return client.query('select mail from user WHERE mail = ',[mail])
.then(res => {
resolved(res.rows);
})
.catch(e => {
rejeted(e);
client.end();
}); // catch
})//promise
} //getUser
const signup = (user) => {
return new Promise((resolved, rejeted)=>{
client.connect().then(() => {
getuser(user.email, client)
.then(getUserRes => {
if (getUserRes.length==0) {
return true;
}
client.end();
return resolved(false);
})
.then(hashPasswordRes=>{
return crypto.hashPassword(user.password);
})
.then(queryRes=>{
if (queryRes) {
const nowtime = new Date();
return client.query('insert into user(mail, password) values (,)',
[user.email, queryRes])
} else {
client.end();
return rejeted('some error');
}
})
.then(res=>{
resolved(true);
client.end();
})
}) // client.connect then
.catch(error => {
rejeted('some error');
client.end();
});// catch
}) //promise
};//signup
exports.signup = signup;
return 结束了当前函数 运行,这不是 promise 链。所以这部分:
return resolved(false); //SHOULD STOP + RETURN HERE
结束当前函数,即:
res => {
if (res.length == 0) {
return true;
}
return resolved(false); //SHOULD STOP + RETURN HERE
}
注意到箭头声明了一个函数。
如果你想停止链,你可以这样做
Promise.resolve(res)
.then(res => {
if (shouldKeepGoing(res)) {
return allTheOtherPromises(res)
}
return true
})
const allTheOtherPromises = res => {
// Here you do all the promises you were doing
}
我有以下用于注册用户的代码。
const pgp = require('pg-promise')();
const crypto = require('./crypto.js');
const db = pgp(connection);
const querySelect = (text, params) => {
const s = pgp.as.format(text, params);
return db.any(s)
.then(data => {
return data;
})
.catch(error => {
return error;
});
}
const queryInsert = (text, params) => {
const s = pgp.as.format(text, params);
return db.one(s)
.then(data => {
return data;
})
.catch(error => {
return error;
});
}
const signup = (user) => {
return new Promise((resolved, rejeted)=>{
return querySelect('select username from user WHERE username = ', [user.username])
.then(res => {
if (res.length == 0) {
return true;
}
return resolved(false); //SHOULD STOP + RETURN HERE
})
.then(hashPasswordRes=>{
return crypto.hashPassword(user.password);
})
.then(queryRes=>{
if (queryRes) {
return queryInsert('insert into user (username,password) values (,) RETURNING id',
[user.username, user.password]);
} else {
return rejeted('error while signup');
}
})
.then(res=>{
resolved(true);
})
.catch(error => {
return rejeted('error while signup');
});// catch
}) //promise
};//signup
exports.signup = signup;
这基本上就是整个文件。我猜很简单。
问题是,在我评论 SHOULD STOP + RETURN HERE
的地方,它确实 return false
(这意味着已经是一个现有的用户名,就像插入的用户名一样)
但执行从未停止,因此用户最终保存在数据库中(即使执行了 return resolved(false);
)。
我在这里做错了什么?这曾经在我只有 pg module in my code. When I used pg-promise 时有效,但它开始出现此问题。
坦率地说,我不知道为什么 "return" 也没有停止函数执行。请指教
(node 8.11.1, express 4.16.3, pg 7.4.2, pg-promise 8.4.4)
谢谢
编辑
郑重声明,这是没有 pg-promise 的同一个文件,它工作得很好。 vars 名称发生变化,但您可以看到逻辑。我尝试使用与 pg-promise
相同的逻辑 const crypto = require('./crypto.js');
const {Client} = require('pg');
const getuser = (mail, client) => {
return new Promise((resolved, rejeted)=>{
return client.query('select mail from user WHERE mail = ',[mail])
.then(res => {
resolved(res.rows);
})
.catch(e => {
rejeted(e);
client.end();
}); // catch
})//promise
} //getUser
const signup = (user) => {
return new Promise((resolved, rejeted)=>{
client.connect().then(() => {
getuser(user.email, client)
.then(getUserRes => {
if (getUserRes.length==0) {
return true;
}
client.end();
return resolved(false);
})
.then(hashPasswordRes=>{
return crypto.hashPassword(user.password);
})
.then(queryRes=>{
if (queryRes) {
const nowtime = new Date();
return client.query('insert into user(mail, password) values (,)',
[user.email, queryRes])
} else {
client.end();
return rejeted('some error');
}
})
.then(res=>{
resolved(true);
client.end();
})
}) // client.connect then
.catch(error => {
rejeted('some error');
client.end();
});// catch
}) //promise
};//signup
exports.signup = signup;
return 结束了当前函数 运行,这不是 promise 链。所以这部分:
return resolved(false); //SHOULD STOP + RETURN HERE
结束当前函数,即:
res => {
if (res.length == 0) {
return true;
}
return resolved(false); //SHOULD STOP + RETURN HERE
}
注意到箭头声明了一个函数。
如果你想停止链,你可以这样做
Promise.resolve(res)
.then(res => {
if (shouldKeepGoing(res)) {
return allTheOtherPromises(res)
}
return true
})
const allTheOtherPromises = res => {
// Here you do all the promises you were doing
}