我有一个API,可以从客户端接收ajax调用并管理响应以显示接收到的数据。
响应是由mongodb集合中的所有文档填充的对象数组,但是到达时为空。
服务器中的脚本正常工作,我可以在发送之前记录阵列,我搜索了很多主题,但没有合适的内容。
服务器:
app.route('/api/issues/:project')
.get(function (req, res) {
var project = req.params.project;
var result = [];
mongo.connect(process.env.DATABASE, (err, db) => {
if (err) {
console.log('Database error: ' + err);
} else {
console.log('getting...');
db.collection('apitest').find().forEach(element => {
result.push(element);
});
console.log(result);
res.send(result);
};
}
);
})
客户:
$(function() {
var currentProject = window.location.pathname.replace(/\//g, "");;
var url = "/api/issues/"+currentProject;
$('#projectTitle').text('All issues for: '+currentProject);
$.ajax({
type: "GET",
url: url,
success: function(data)
{
console.log(this);
var issues= [];
data.forEach(function(ele) {
console.log(ele);
var openstatus;
(ele.open) ? openstatus = 'open' : openstatus = 'closed';
var single = [
// example
'<div>' + ele.property + '</div>',
'<div>' + ele.property + '</div>',
'<div>' + ele.property + '</div>'
];
issues.push(single.join(''));
});
$('#issueDisplay').html(issues.join(''));
}
});
});
我找到了问题和“解决方案”。问题是该调用是异步的,因此在结果与值为空数组的情况下,在连接到db和数组填充之前,响应开始。
我已经解决了将响应包含在setTimeout中的问题,但是我不确定管理这种情况的正确方法。如果有人可以建议我一些有关异步的初学者阅读,我真的很感激。
setTimeout(function () {
res.send(result);
}, 50);