渲染前等待地图功能

时间:2018-02-08 08:34:24

标签: 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.results = results.length;
        });
        break;
      case 'table':
        dbConnexion.query(card.query).success( function(results) {
          card.results = results;
        });
        break;
    }
  return card;
});
response.render('myview', {
  newCards: newCards
});

3 个答案:

答案 0 :(得分:2)

您正在使用地图中的异步功能,您应该宣传您的地图并等待承诺完成。

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
  });  
});

答案 1 :(得分:0)

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

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});
});

错误处理留作练习(拒绝地图中的promise,然后在最终的Promise对象上调用.catch)

答案 2 :(得分:0)

您遇到与How do I return the response from an asynchronous call?

类似的问题

您对数据库的调用是异步的

dbConnexion.query(card.query).success( function(results) {
          card.results = results.length;
        });

请查看上述问题,了解处理它的策略。