gpt4 book ai didi

javascript - 我是否正确使用了 Promise?

转载 作者:行者123 更新时间:2023-11-29 07:05:51 25 4
gpt4 key购买 nike

我现在正在做一个学校项目,我想使用 promise 来实现我的“匹配功能”,但显然我做错了。我有一个约会网站,用户可以在其中结识其他人并与他们“匹配”。这就是想法。我正在做一个建议,所以它会自动建议配置文件。到目前为止,我可以为“异性恋用户”推荐人们,但在这里我试图为“双性恋用户”推荐,但我无法让它发挥作用。

我有一个名为 getPotentialsLocation() 的函数,如果我给它我的“直接用户”表 (straightPotentials),它会完美地工作,但它可以进入我的其他条件 (else if (biPotentials))

为什么?我周围的每个人都尝试过,但我们找不到任何答案。

因此,如果我尝试获取“直接用户”,它会返回包含位置和所有内容的行。如果我尝试“bi users”,它会阻塞,因为它无法进入其他条件事件,尽管我可以一直 console.log(biPotentials)

我希望我的代码有意义,如果没有请告诉我。因为我要在这里链接很多代码

router.post('/matchaSearch', function (req, res) {
var username = session.uniqueID;
var searcherInfos = {};
var straightPotentials = [];
var biPotentials = [];

function suggestUsers(){
return new Promise((resolve, reject) => {
pool.getConnection((err, connection) => {
var query = 'SELECT sex, orientation FROM usersinfo WHERE username = ?';
connection.query(query, [username], (err, rows, fields) => {
connection.release()
return err ? reject(err) : resolve(rows)
})
})
})
}

suggestUsers()
.then((rows) => {
searcherInfos = rows;
if (searcherInfos[0].sex === 'm' && searcherInfos[0].orientation === 's'){
console.log("searcher is straight");
lookForSF()
.then((rows) => {
if (rows) {
for (var i = 0; i < rows.length; i++) {
straightPotentials.push(rows[i].username)
}
if (straightPotentials){
console.log("straightPotentials" + straightPotentials);
getPotentialsLocation()
.then((rows) => {
console.log(rows);
}).catch((err) => {
throw err;
})
}
}
}).catch((err) => {
throw err;
});


} else if ((searcherInfos[0].sex) && searcherInfos[0].orientation === 'b'){
console.log("searcher is bi");
lookForbothCauseImB()
.then((rows) => {
if (rows) {
for (var i = 0; i < rows.length; i++) {
biPotentials.push(rows[i].username)
}
if (biPotentials){
console.log("biPotentials" + biPotentials);
getPotentialsLocation()
.then((rows) => {
console.log(rows);
}).catch((err) => {
throw err;
})
}
}
}).catch((err) => {
throw err;
})
}

//this is the .catch for my first function (suggestUsers())
}).catch((err) => {
throw err;
})



function lookForSF(){
return new Promise((resolve, reject) => {
pool.getConnection((err, connection) => {
var query = 'SELECT username FROM usersinfo WHERE sex = "f" AND orientation = "s" AND username != ?';
connection.query(query, [username], (err, rows, fields) => {
connection.release()
return err ? reject(err) : resolve(rows)
})
})
})
}


function lookForbothCauseImB(){
return new Promise((resolve, reject) => {
pool.getConnection((err, connection) => {
var query = 'SELECT username FROM usersinfo WHERE sex = "f" OR sex = "m" AND orientation = "s" OR orientation = "b" AND username != ?';
connection.query(query, [username], (err, rows, fields) => {
connection.release()
return err ? reject(err) : resolve(rows)
})
})
})
}


function getPotentialsLocation(){
if (straightPotentials) {
var string = '('
for (var i =0; i <straightPotentials.length - 1; i++){
string += '\'' + straightPotentials[i] + '\', ';
}
string += '\'' + straightPotentials[straightPotentials.length - 1] + '\')';
return new Promise((resolve, reject) =>{
pool.getConnection((err, connection) => {
var query = 'SELECT * FROM userlocation WHERE username IN ' + string;
console.log("this is our query " + query);
connection.query(query, (err, rows, fields) => {
connection.release();
return err ? reject(err) : resolve(rows)
})
})
})
} else if (biPotentials) {
var string = '('
for (var i =0; i <biPotentials.length - 1; i++){
string += '\'' + biPotentials[i] + '\', ';
}

string += '\'' + biPotentials[biPotentials.length - 1] + '\')';
console.log("this is string" + string);
return new Promise((resolve, reject) =>{
pool.getConnection((err, connection) => {
var query = 'SELECT * FROM userlocation WHERE username IN ' + string;
console.log("this is our query " + query);
connection.query(query, (err, rows, fields) => {
connection.release();
return err ? reject(err) : resolve(rows)
})
})
})
}
}
})

最佳答案

如你所想,事实并非如此。

这个错误是嵌套 promise 反模式(谷歌搜索)

您的代码非常庞大,需要进行大规模重构才能以正确的方式进行设置

你在这里

function query (pool, sql, values) {
return new Promise((resolve, reject) => {
pool.getConnection((err, connection) => {
var query = sql
connection.query(query, values, (err, rows) => {
connection.release()
err ? reject(err) : resolve(rows)
})
})
})
}

function suggestUsers (pool, username) {
return query(pool, 'SELECT sex, orientation FROM usersinfo WHERE username = ?', [username])
}

function lookForSF (pool, username) {
return query(pool, 'SELECT username FROM usersinfo WHERE sex = "f" AND orientation = "s" AND username != ?', [username])
}

function lookForbothCauseImB (pool, username) {
return query(pool, 'SELECT username FROM usersinfo WHERE sex = "f" OR sex = "m" AND orientation = "s" OR orientation = "b" AND username != ?', [username])
}

function getPotentialsLocation (pool, potentials) {
var usernames = potentials.map((potential) => {
return "'" + potential + "'"
})
return query(pool, 'SELECT * FROM userlocation WHERE username IN (' + usernames.join(',') + ')')
}

function matchaSearch (pool, username) {
return suggestUsers(pool, username)
.then((searcherInfos) => {
if (searcherInfos[0].sex === 'm' && searcherInfos[0].orientation === 's') {
return lookForSF(pool, username)
} else if ((searcherInfos[0].sex) && searcherInfos[0].orientation === 'b') {
return lookForbothCauseImB(pool, username)
}
})
.then((rows) => {
var potentials = rows.map((row) => {
return row.username
})
console.log('potentials' + potentials)
return getPotentialsLocation(pool, potentials)
})
}

router.post('/matchaSearch', function (req, res) {
matchaSearch(pool, session.uniqueID)
.then((results) => {
console.log('result', results)
res.send(JSON.stringify(results))
})
.catch((err) => {
console.error('error', err)
res.status(500).send('something wrong')
})
})

关于javascript - 我是否正确使用了 Promise?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41723593/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com