2017-08-15 10 views
0

約束の助けを借りてJavaScriptのフィルタ関数を使用して、すべてのセッション(私)の配列を返そうとしていますが、JSON応答として送信しています。javascriptフィルタ関数で約束を使用して返す

しかし、動作しません。

ありがとうございます!

app.get('/explore', (req, res) => { 
    P.coroutine(function *(){ 
    let 
     { id: session } = req.session, 
     followings = yield db.query('SELECT id, username, email FROM users WHERE id <> ? ORDER BY RAND() LIMIT 10', [session]), 
     d = followings.filter(e => { 
      db.is_following(session, e.id).then(s => s) // returns boolean 
     }) 

     res.json(d) 
    })() 
}) 

答えて

0

アダムのソリューションは非常によく働いたが、私は非同期を使用する別の解決策を発見しました/待つ。

コードははるかに少なく人間が判読できます!

app.post('/explore', async function(req, res) { 
    let 
    { id: session } = req.session, 
    exp = [], 
    followings = await db.query('SELECT id, username, email FROM users WHERE id <> ? ORDER BY RAND() LIMIT 10', [session]) 

    for (let f of followings) { 
    let is = await db.is_following(session, f.id) 
    !is ? exp.push(f) : null 
    } 

    res.json(exp) 

}) 
1

Array.prototype.filter同期している - あなたは、非同期フィルターの配列をフィルタリングすることはできません。あなたは何ができるか

は、それらのすべてが解決されたときに応答を返し、その後、約束の配列を作成することです:

var promises = []; 
var d = []; 
followings.forEach(function(e) { 
    promises.push(
    db.is_following(session,e.id).then(function(s) { 
     //following, push e onto `d` 
     d.push(e); 
    }).catch(function() { 
     //not following, I assume, do nothing 
    }) 
); 
}); 

Promise.all(promises).then(function() { 
    //send the response after all the is_following requests have finished 
    res.json(d); 
}); 
+0

Thnxたくさん..今働いた! –

+0

私はこのプロジェクトでこのロジックを使用しました。 https://github.com/yTakkar/Single-Page-Social-Network –

+0

私はasync/awaitを使用する別のソリューションを見つけました –

関連する問題