2016-12-04 32 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%正确的! –