我现在正在开展一个学校项目,我想使用承诺来实现我的“匹配功能”,但显然我做错了。 我有一个约会网站,用户可以与其他人会面并与他们“匹配”。这是个主意。我正在做一个建议,所以它会自动建议配置文件。到目前为止,我可以建议人们使用“直接用户”,但在这里我正在尝试为“双用户”做这件事而我无法让它发挥作用。
我有一个名为getPotentialsLocation()
的函数,如果我给它的是“直接用户”(straightPotentials
)表,它可以很好地工作但它可以进入我的其他条件({{1} })
为什么?我身边的每个人都试过但我们找不到任何答案。
因此,如果我想要'直接用户',它会返回包含位置和所有内容的行。如果我试图'双用户'它会阻止因为它无法进入其他条件事件,尽管我可以else if (biPotentials)
一直向上。
我希望我的代码有意义,如果没有请告诉我。因为我要在这里链接很多代码
console.log(biPotentials)
答案 0 :(得分:2)
正如你想的那样,你没有。
错误是嵌套承诺反模式(google it)
你的代码很庞大,需要以正确的方式设置大量的重构
你在这里
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')
})
})
答案 1 :(得分:0)
我看到至少有两个地方你在.then
链中有一些不返回任何东西的函数。
这将破坏承诺链。
参见例如:
lookForbothCauseImB().then(...)
和
getPotentialsLocation().then(...)
两者似乎都需要return
。