我想测试我可以做多少请求并让他们的总时间过去。我的Promise
功能
async execQuery(response, query) {
let request = new SQL.Request();
return new Promise((resolve, reject) => {
request.query(query, (error, result) => {
if (error) {
reject(error);
} else {
resolve(result);
}
});
});
}
我的api
app.get('/api/bookings/:uid', (req, res) => {
let st = new stopwatch();
let id = req.params.uid;
let query = `SELECT * FROM booking.TransactionDetails WHERE UID='${id}'`;
for (let i = 0; i < 10000; i++) {
st.start();
db.execQuery(res, query);
}
});
自for
以来我无法停止async
循环,但我也不知道如何在首先拒绝之后停止执行其他呼叫,这样我才能获得柜台和所有成功承诺的经过时间。我怎样才能做到这一点?
答案 0 :(得分:1)
您可以轻松地为此创建一个可组合的包装器或子类:
class TimedPromise extends Promise {
constructor(executor) {
this.startTime = performance.now(); // or Date.now
super(executor);
let end = () => this.endTime = performance.now();
this.then(end, end); // replace with finally when available
}
get time() {
return this.startTime - this.endTime; // time in milliseconds it took
}
}
然后您可以使用以下方法:
TimedPromise.all(promises);
TimedPromise.race(promises);
var foo = new TimedPromise(resolve => setTimeout(resolve, 100);
let res = await foo;
console.log(foo.time); // how long foo took
Plus then
链接可以正常工作,异步函数不会被激活(因为它们总是返回原生承诺)。
function time(promise) {
var startTime = performance.now(), endTime;
let end = () => endTime = performance.now();
promise.then(end, end); // replace with finally when appropriate.
return () => startTime - endTime;
}
然后用法是:
var foo = new Promise(resolve => setTimeout(resolve, 100);
var timed = time(foo);
await foo;
console.log(timed()); // how long foo took
这具有在任何地方工作的优点,但缺点是手动必须计时。我更喜欢这种方法,因为它的外观和可以说是更好的设计。
作为警告,由于附加了拒绝处理程序,您必须 100%确定您正在添加自己的.catch
或then
处理程序,否则错误不会记录到控制台。
答案 1 :(得分:-1)
这不符合您的承诺吗?
new Promise((resolve, reject) => {
var time = Date.now();
request.query(query, (error, result) => {
if (error) {
reject(error);
} else {
resolve(result);
}
});
}).then(function(r){
//code
}).catch(function(e){
console.log('it took : ', Date.now() - time);
});
或者在你的db.execQuery()调用之后放上.then和.catch
答案 2 :(得分:-1)
您发表了2条评论,表示您希望在承诺失败但是未提及SQL
是什>
在for循环中,您已经运行了所有request.query
语句,如果您只想运行一个查询,那么另一个必须执行request.query
,但这需要更长时间,因为您不要一次启动它们。
这里的代码可以告诉你所有查询花了多长时间,但我认为你应该告诉我们request.query(query).then(-=>request.query(query)).then...
是什么,这样我们就可以弄清楚如何设置连接池和缓存(可能是最大的性能提升者)。
SQL