我想在重新发送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
});
答案 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;
});
请查看上述问题,了解处理它的策略。