Node.js 在渲染之前等待贴图函数

Node.js 在渲染之前等待贴图函数,node.js,Node.js,在呈现EJS模板之前,我想在NodeJS中使用map()来更改数组中的项目 但是,有时在渲染之前,map()没有完成,我得到一个错误500 我的代码: var newCards = cards.map(function(card) { switch(card.display) { case 'number': dbConnexion.query(card.query).success( function(results) { card.r

在呈现EJS模板之前,我想在NodeJS中使用
map()
来更改数组中的项目

但是,有时在渲染之前,
map()
没有完成,我得到一个错误500

我的代码:

 var newCards = cards.map(function(card) {
    switch(card.display) {
      case 'number':
        dbConnexion.query(card.query).success( function(results) {
          card.results = results.length;
        });
        break;
      case 'table':
        dbConnexion.query(card.query).success( function(results) {
          card.results = results;
        });
        break;
    }
  return card;
});
response.render('myview', {
  newCards: newCards
});

您需要在回调返回后进行渲染。最简单的方法(对现有代码的更改最少)是使用承诺

var promises = [];

var newCards = cards.map(function(card) {
  if (card.type == = 'query') {
    switch (card.display) {
    case 'number':
      promises.push(new Promise(function(resolve, reject) {
        dbConnexion.query(card.query).success(function(results) {
          card.results = results.length;
          resolve();
        });
      }));
      break;
    case 'table':
      promises.push(new Promise(function(resolve, reject) {
        dbConnexion.query(card.query).success(function(results) {
          card.results = results.length;
          resolve();
        });
      }));
      break;
    }
  }
  return card;
});

Promise.all(promises).then(function() {
  response.render('glovebox', {pages : pages, newCards : newCards});
});

错误处理留作练习(拒绝映射内的承诺,然后调用.捕获最终的承诺对象)

如果在映射内使用异步函数,则应提示映射并等待承诺完成

let promises = cards.map(function(card) {
  return new Promise(function(resolve, reject) {
    switch(card.display) {
      case 'number':
        dbConnexion.query(card.query).success( function(results) {
          card.results = results.length;
          resolve(card);
        });
        break;
      case 'table':
        dbConnexion.query(card.query).success( function(results) {
          card.results = results;

          resolve(card);
        });
        break;
    }
  });
});

Promise.all(promises).then(() => {
  response.render('myview', {
   newCards: newCards
  });  
});

你也有类似的问题

这里对数据库的调用是异步的

dbConnexion.query(card.query).success( function(results) {
          card.results = results.length;
        });
看看上面的问题,找出应对策略