【发布时间】:2018-05-21 12:20:00
【问题描述】:
有没有办法在每次响应时执行 1 个请求和 write?我想发出 1 个请求并在内部对 db 发出 10 个请求,并且当查询响应写入 html?我怎样才能做到这一点?
我的 api
routeHandlers = () => {
let data: Array<any> = [];
this._router.get('/api/countdetails/:uid', (req, res) => {
let uid = req.params.uid;
console.log(req);
for (let i = 0; i < 10; i++) {
data.push({
id: 'request' + i,
startTime: performance().toFixed(3)
});
let query = `SELECT ${i} AS ID, * FROM CountDetails WHERE UID='${uid}'`;
this._db.execQuery(query, (err, row) => {
if (err) throw err;
for (let i = 0; i < data.length; i++) {
Object.keys(data[i]).forEach((val, idx) => {
if (val === 'id') {
if (data[i][val] === 'request' + row[0]['ID']) {
data[i].endTime = performance().toFixed(3);
data[i].ellapsed = (performance() - data[i]['startTime']).toFixed(3);
res.write('<tr><td>' + data[i]['ellapsed'] + '</td></tr>');
}
}
});
}
});
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
res.end();
}
});
}
还有我的html
<div>
<input type="text" id="iterations" />
<button type="button" id="btn">send</button>
</div>
<div>
<table id="tbl">
<tbody>
</tbody>
</table>
</div>
<script>
var inputValue = document.getElementById('iterations');
var btn = document.getElementById('btn');
var array = [];
btn.addEventListener('click', function () {
sendRequest(function (xhttp) {
console.log(xhttp.responseText);
})
});
function sendRequest(callback) {
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
callback(xhttp);
}
};
xhttp.open("GET", "http://localhost:3000/api/countdetails/EAACCDF4-EBC3-4B11-8654-98878BFC4B7B", true);
xhttp.send({ times: 10});
}
</script>
【问题讨论】:
-
你的代码有什么问题?您的控制台是否给您任何错误?
-
问题是我不知道什么时候打电话给
res.end(),因为请求是async,而我在每次通话结束之前end。 -
this._db.execQuery来自哪个 npm? -
@Stamos 是我的类函数,它使用
sqlite3模块发出数据库请求 -
我建议使用
promises,因为它是异步的。您可以将 sqlite3 方法包装到 Promise 中。您可以使用 'reduce' 执行链或与Promise.all并行运行。或者,如果您不想使用 Promise,那么您可以使用函数进行递归。
标签: javascript node.js express asynchronous