2017-02-01 8 views
-1

これは愚かな質問かもしれないが、学校でそれを行う方法を知っている人はいない。 私は完全に動作するこのコードを持っています(オブジェクトテーブルpotentialsを送信して、クライアント側で作業することができます)しかし、別のものも必要と思いました(userData)。 だから私はそれをconstと宣言してから、それを私のres.renderの直前に記録しようとしましたが、それはundefinedです。私たちのグループの学生はこれまでの約束にあまり慣れていないので、ここで何か不足しているかもしれません。 とにかく私のコードは、どんな助けですか?ありがとうございました。この約束からの価値を返す

function matchaSearch (pool, username) { 
return suggestUsers(pool, username) 
    .then((searcherInfos) => { 
    userData = [...searcherInfos] 
    if (userData[0].sex === 'm' && userData[0].orientation === 's') { 
     return lookForSF(pool, username) 
    } else if ((userData[0].sex) && userData[0].orientation === 'b') { 
     return lookForbothCauseImB(pool, username) 
    } else if ((userData[0].sex) === 'f' && userData[0].orientation === 's') { 
     return lookForSM(pool, username) 
    } else if ((userData[0].sex) === 'm' && userData[0].orientation === 'g') { 
     return lookForGM(pool, username) 
    } else if ((userData[0].sex) === 'f' && userData[0].orientation === 'g') { 
     return lookforGF(pool, username) 
    } 
    }) 
    .then((rows) => { 
    var potentials = rows; 
    return (potentials) 
    }) 
} 

router.post('/matchaSearch', function (req, res) { 
const userData = [] 
matchaSearch(pool, session.uniqueID) 
.then((potentials) => { 
    console.log(userData); 
    res.render('./userMatch', {potentials, userData}) 
}) 
.catch((err) => { 
    console.error('error', err) 
    res.status(500).send("we don't have any suggestions for you so far") 
}) 
}) 
+0

'userData'は空の配列ですか? – guest271314

+0

実際に私はちょうど答えを見つけました。これを投稿して申し訳ありません。 res.renderの直前の変数から関数を呼び出して移動することができます。 – pkerckho

+0

あなたの質問に答えましたか? – jfriend00

答えて

0

あなたは正しい方法でPromiseを使用していません。返品のようなものはありません。あなたのコードの例は、

var searcherInfosPro = (searcherInfos)=>{ 
    return new Promise((fullfill,reject)=>{ 
    userData = [...searcherInfos]; 
    if (userData[0].sex === 'm' && userData[0].orientation === 's') { 
     fullfill([pool,username]); 
    }else if((userData[0].sex) && userData[0].orientation === 'b') { 
     fullfill([pool,username]); 
    }else{ 
     reject((new Error("Some error detected")); 
    } 
    }); 
} 

することができ、あなたは上記のコードはどのように短いバージョンですので、あなたのコードを見てみると

suggestUsers(pool, username) 
    .then(searcherInfosPro) 
    .then((rows) => { 
    var [pool,username] = rows; 
    return (potentials) 
    }) 
    .catch((ex)=>{ 
    console.log(ex.message); 
    }); 

を使用して、それは私にたくさん明確ではなかったことを呼び出すことができます適切に約束を使用し、次にデータを渡す。また、エラーが発生した場合は常にcatchを使用してください。

上記のコードから、elseケースが呼び出され、エラーが発生し、Some error detectedが表示されます。ここで

0

それは私の作品、私がやったことです:

router.post('/matchaSearch', function (req, res) { 

matchaSearch(pool, session.uniqueID) 
.then((potentials) => { 
    userData = suggestUsers(pool, username) 
    .then((rows) => { 
     res.render('./userMatch', {potentials, rows}) 
    }) 


}) 
.catch((err) => { 
    console.error('error', err) 
    res.status(500).send("we don't have any suggestions for you so far") 
}) 
}) 
0

あなたはあなたの問題の一部のための答えを見つけたように見えます。

  1. すべてのif/else節をルックアップテーブルで置き換えてください。
  2. userDataをより高いスコープの変数に設定しようとする副作用のプログラミングを削除して、後でそれを取り上げることができます。
  3. プロミスから複数の値を返す方法(オブジェクトにラップする)

コード:

const fnLookup = { 
    'ms': lookForSF, 
    'fs': lookForSM, 
    'mg': lookForGM, 
    'fg': lookForGF, 
    'mb': lookForbothCauseImB, 
    'fb': lookForbothCauseImB 
}; 


function matchaSearch (pool, username) { 
    return suggestUsers(pool, username).then(searcherInfos => { 
     let userData = [...searcherInfos]; 
     let fn = fnLookup[userData[0].sex + userData[0].orientation]; 
     if (fn) { 
      return fn(pool, username).then(potentials => { 
       return {potentials, userData}; 
      }); 
     } else { 
      throw new Error(`Unexpected values for sex ${userData[0].sex} or orientation ${userData[0].orientation}`); 
     } 
    }); 
} 

router.post('/matchaSearch', (req, res) => { 
    matchaSearch(pool, session.uniqueID).then(data => { 
     console.log(data.userData); 
     res.render('./userMatch', data); 
    }).catch(err => { 
     console.error('error', err) 
     res.status(500).send("we don't have any suggestions for you so far") 
    }); 
});