我是否正确使用了承诺?

时间:2017-01-18 15:45:52

标签: javascript mysql node.js promise

我现在正在开展一个学校项目,我想使用承诺来实现我的“匹配功能”,但显然我做错了。 我有一个约会网站,用户可以与其他人会面并与他们“匹配”。这是个主意。我正在做一个建议,所以它会自动建议配置文件。到目前为止,我可以建议人们使用“直接用户”,但在这里我正在尝试为“双用户”做这件事而我无法让它发挥作用。

我有一个名为getPotentialsLocation()的函数,如果我给它的是“直接用户”(straightPotentials)表,它可以很好地工作但它可以进入我的其他条件({{1} })

为什么?我身边的每个人都试过但我们找不到任何答案。

因此,如果我想要'直接用户',它会返回包含位置和所有内容的行。如果我试图'双用户'它会阻止因为它无法进入其他条件事件,尽管我可以else if (biPotentials)一直向上。

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

console.log(biPotentials)

2 个答案:

答案 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