计算Promises直到拒绝的总耗用时间?

时间:2017-12-06 09:51:21

标签: javascript node.js promise

我想测试我可以做多少请求并让他们的总时间过去。我的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循环,但我也不知道如何在首先拒绝之后停止执行其他呼叫,这样我才能获得柜台和所有成功承诺的经过时间。我怎样才能做到这一点?

3 个答案:

答案 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%确定您正在添加自己的.catchthen处理程序,否则错误不会记录到控制台。

答案 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