如何从Node.js中的返回/回调聚合中获取值

时间:2018-10-08 01:00:49

标签: node.js mongodb

如何从Node.js中的返回/回调聚合中获取价值?

function getAmount(vcode,callback){db.get().collection('general_journal').find({coa_code:vcode}).limit(1).toArray(function(err, result) {             
    if (err) return callback(err);                  
    callback(null, result);                 
})}
function getlist(callback) {
 db.get().collection().find({}).toArray(function(err, result) {           
    var vData = [];
    if (err) return callback(err);  
    result.forEach(function(row){
      vData.push({coa_code:row.coa_code,amount:getAmount(row.coa_code)})
    })              
    callback(null, vData);                  
  })}

getlist();

由于Amount值始终未定义,请帮助解决此问题,谢谢

1 个答案:

答案 0 :(得分:0)

由于getAmount是异步的,因此在调用Promise.all的回调之前,您必须使用getList等待所有行的请求得到解决。更改getAmount以返回Promise而不是使用回调使事情变得简单:

function getAmount(vcode){
  return new Promise((resolve, reject) => {
    db.get().collection('general_journal').find({coa_code:vcode}).limit(1).toArray(function(err, result) {             
      if (err) return reject(err);
      resolve(result);
    })
  });
}
function getlist(callback) {
  db.get().collection().find({}).toArray(function(err, result) {
    if (err) return callback(err);
    // Map each row to a Promise that resolves to an object:
    Promise.all(
      result.map(({ coa_code }) => getAmount(coa_code).then(amount => ({ amount, coa_code })))
    )
      .then(vData => {
        callback(null, vData);
      });
  })
}