Node.js 在渲染之前等待贴图函数
在呈现EJS模板之前,我想在NodeJS中使用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
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;
});
看看上面的问题,找出应对策略