2017-02-07 60 views
-1

我試圖建立一個buildQuery功能,我的社會職務飼料:如何使用此承諾的結果?

const buildQuery = (criteria) => { 
    const { userId, interest } = criteria; 
    const query = {}; 

    if (interest !== 'everything') { 
    if (interest === 'myInterests') { 
     User.findById(userId).then(user => { 
     return query.categories = { 
     $in: user.interests 
     }; 
     }); 
    } else { 
     query.categories = { $eq: interest }; 
    } 
    } 
    return query; 
}; 

如果interest來通過爲myInterests那麼我想去找的interests屬於用戶(userId)的陣列。

每個帖子都有一個類別數組:query.categories

一旦我找回interests陣列,我想查找query.categories,以篩選出用戶感興趣的帖子myInterests

現在,我的測試顯示這只是被忽略。它將帶回所有帖子。我在這裏做錯了什麼?

謝謝

+0

User.findById是異步的。該函數在執行User.findById查詢之前返回。 嘗試承諾或回調。 – davibq

+0

雖然如果我把它放在then語句中,它的控制檯日誌記錄'user.interests'? – bloppit

回答

0

您將需要等待結果,併爲你的函數需要返回另一個承諾爲更新的查詢。

function buildQuery({userId, interest}) { 
    if (interest === 'everything') 
    return Promise.resolve({}); 
    else 
    return (interest === 'myInterests' 
     ? User.findById(userId).then(user => ({$in: user.interests})) 
     : Promise.resolve({$eq: interest}) 
    ).then(categories => ({categories})); 
} 

然後等待這個承諾執行查詢之前:

buildQuery(criteria).then(runQuery).then(results => …) 
+0

明白了,謝謝 – bloppit