2016-12-04 66 views
0

我試圖使用async.parallel執行兩個Mongoose查詢,然後對結果進行處理。然而,當我試圖訪問這些結果results[0]results[1]他們返回承諾:如何從async.parallel訪問結果?

Promise { 
_c: [], 
_a: undefined, 
_s: 0, 
_d: false, 
_v: undefined, 
_h: 0, 
_n: false } ] 

我還是用異步和承諾熟悉自己,我不知道如何實際訪問應該返回的文件由兩個查詢。任何幫助將不勝感激!

我目前的功能:

export const getItems = (req, res) => { 
    const itemId = "57f59c5674746a6754df0d4b"; 
    const personId = "584483b631566f609ebcc833"; 

    const asyncTasks = []; 

    asyncTasks.push(function(callback) { 
     try { 
      const result = Item.findOne({ _id: itemId }).exec(); 
      callback(null, result); 
     } catch (error) { 
      callback(error); 
     } 
    }); 

    asyncTasks.push(function(callback) { 
     try { 
      const result = User.findOne({ _id: personId }).exec(); 
      callback(null, result); 
     } catch (error) { 
      callback(error); 
     } 
    }); 

    async.parallel(asyncTasks, function(err, results) { 
     if (err) { 
      throw err; 
     } 

     const result1 = results[0]; 
     const result2 = results[1]; 
     console.log('result' + result1); 

    }); 
} 
+0

您應該使用* * async.js *或* promises,b不是兩個。 – Bergi

+0

@Bergi - 我想補充一點,但實際上找不到任何(合理的)討論,爲什麼使用這兩個都是一個壞主意 - 我同意這是一個壞主意,我不能證明爲什麼:p –

+0

@JaromandaX我想我在我的幾個答案中討論過,但是也找不到一個好的聯繫。問題的關鍵在於,當您將nodeback與承諾混合使用時,執行正確的錯誤處理更容易出錯,並且您基本上喪失了承諾對回調的所有優勢。 – Bergi

回答

2

根據該文件,如果你想使用你傳遞一個回調exec()返回一個承諾,即作爲參數傳遞給exec的 - 像這樣

asyncTasks.push(function(callback) { 
    Item.findOne({ _id: itemId }).exec(callback); 
}); 

asyncTasks.push(function(callback) { 
    User.findOne({ _id: personId }).exec(callback); 
}); 

或者,只使用Promises

export const getItems = (req, res) => { 
    const itemId = "57f59c5674746a6754df0d4b"; 
    const personId = "584483b631566f609ebcc833"; 

    const promises = []; 

    promises.push(Item.findOne({ _id: itemId }).exec()); 
    promises.push(User.findOne({ _id: personId }).exec()); 

    Promise.all(promises) 
    .then(function(results) { 
     const result1 = results[0]; 
     const result2 = results[1]; 
     console.log('result' + result1); 
    }) 
    .catch(function(err) { 
     console.log(err); 
    }); 
} 
+0

我很想知道你的答案,因爲我甚至不確定第一個答案是100%正確的! –