2017-01-18 13 views
0

私は今、学校プロジェクトに取り組んでいます。私は私の "マッチング関数"に約束していますが、明らかにこれを間違っています。 私は、ユーザーが他の人と出会い、彼らと「一致」できる出会い系サイトを持っています。これがアイディアです。私は提案をしているので、プロファイルを自動的に提案します。これまでのところ、私は「ストレートユーザー」のための人々を提案することができますが、ここで私は「バイユーザ」のためにそれをしようとしています。私は約束を正しく使用していますか?

私は私はそれを「まっすぐユーザー」(straightPotentials)の私のテーブルを与えているが、それは私の他の条件(else if (biPotentials)

なぜに入ることができれば、それは完璧に動作し、getPotentialsLocation()と呼ばれる機能がありますか?私の周りのみんなが試みましたが、答えは見つかりませんでした。

私は 'まっすぐなユーザー'を取得しようとしているので、場所とすべての行を返します。私は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) 
     }) 
     }) 
    }) 
    } 
} 
}) 
+0

コードハイライトを修正することをお勧めします。 –

+0

私はあなたがいつもstraightPotentialsをテストしているようです(これは常に[]]のように真であるため、biPotentialsの条件は評価されません)。 ..} else if(biPotentials){// ...} } ' – sweaver2112

答えて

2

あなたはそうではありません。

間違いは、コードのあなたの作品は、あなたが

ある巨大であり、ここで正しい方法で

を設定する大規模なリファクタリングが必要ネストされた約束アンチパターン(それをグーグル)

です

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') 
    }) 
}) 
+0

私はちょっと問題があることを理解していますが、それを知っている学校で私の周りの人を見つけることはできません。あなたはそれを構造化し、この入れ子にされた問題を回避する助けてもらえますか? – pkerckho

+0

私はあなたのコードをリファクタリングしています:) –

+0

あなたの助けをありがとう、私はまた私の仲間と私の側でそれを修正しようとしています。だからあなたが解決策を持っているなら、それは学校でも多くの人々を助けるでしょう! – pkerckho

0

多くのコードをリンクするつもりですので、私はあなたが何も返さない.thenチェーン内の機能を持っている、少なくとも二つの場所を参照してください。

これは、約束を破るでしょう。

例えば参照してください:

lookForbothCauseImB().then(...) 

getPotentialsLocation().then(...) 

を彼らの前にreturnを必要とするように見えるどちらも。

+0

私はそれを取得できません。つまり、私は' lookForbothCauseImB() '関数から何かを返す必要があるのですか?私はすでに私のクエリから行を返します。これが間違っていますか? – pkerckho

+0

いいえ、私は、上記の行が_inside_ '.then'コールバックで表示されるので、' return '、つまりreturn lookForbothCauseImB()。then(...)' – Alnitak

+0

本当にありませんそれを手に入れません。私は3ヶ月前にjavascriptを始めましたので、まだかなり新しいです。 – pkerckho

関連する問題