在一个请求中逐个发送回应?

有没有办法做一个请求,每次write回应呢? 我想做1个请求,并在里面做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> 

首先不要使用i的嵌套。

所以一旦所有的数据库调用完成,你都要调用res.end() 。 这可以通过多种方式完成,但是我会给你一个快速的代码。 这是代码片段和解释之后:( 也读取代码中的注释

 routeHandlers = () => { /* 1) we can use the indicator to determine when all the async requests are finished */ let indicator = 0; let data = []; this._router.get('/api/countdetails/:uid', (req, res) => { /* 2) always set the indicator to 0 on a new request */ indicator = 0; let uid = req.params.uid; 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 j = 0; j < data.length; j++) { Object.keys(data[j]).forEach((val, idx) => { if (val === 'id') { if (data[j][val] === 'request' + row[0]['ID']) { data[j].endTime = performance().toFixed(3); data[j].ellapsed = (performance() - data[j]['startTime']).toFixed(3); res.write('<tr><td>' + data[j]['ellapsed'] + '</td></tr>'); } } }); } /* 3) here check if indicator is 10 and if yes then all the database calls should be finished */ indicator++; if (indicator === 10) { res.header("Access-Control-Allow-Origin", "*"); res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept"); res.end(); } }); } }); } 

简而言之,我将使用整数variables作为一个指标多less个数据库调用完成,一旦达到10号,我认为所有的事情都完成了,并结束响应。

1)宣布indicatorvariables,这将有助于我们确定工作何时准备好;

2)重置指标在每个接下来的请求( 你也可能认为重置 data

3)一旦数据库调用完成增量indicator并检查其值 – >如果它是10,那么我们完成并结束响应。

就是这样,简单而简单。 让我知道,如果有什么不清楚。