Javascript 计算承诺到拒绝的总时间?

Javascript 计算承诺到拒绝的总时间?,javascript,node.js,promise,Javascript,Node.js,Promise,我想测试我能做多少请求,并得到它们的总时间。我的承诺功能 async execQuery(response, query) { let request = new SQL.Request(); return new Promise((resolve, reject) => { request.query(query, (error, result) => { if (error) { rejec

我想测试我能做多少请求,并得到它们的总时间。我的
承诺
功能

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);
    }
});
app.get('/api/bookings/:uid',(req,res)=>{
让st=新秒表();
设id=req.params.uid;
让query=`SELECT*FROM booking.TransactionDetails,其中UID='${id}`;
for(设i=0;i<10000;i++){
st.start();
db.execQuery(res,query);
}
});

我无法停止
for
循环,因为它是
异步的
,但我也不知道如何在第一次拒绝后停止执行其他调用,以便获得计数器和所有成功承诺的运行时间。我怎样才能做到这一点呢?

这不符合你的承诺吗

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);
});

或者将.then和.catch放在db.execQuery()调用之后

您可以轻松地为此创建一个可组合的包装器,或者创建一个子类:

继承: 然后您可以使用以下方法:

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
再加上
链接将起作用,异步函数将不起作用(因为它们总是返回本机承诺)

组成: 那么用法是:

 var foo = new Promise(resolve => setTimeout(resolve, 100);
 var timed = time(foo);
 await foo;
 console.log(timed()); // how long foo took
这样做的优点是可以在任何地方工作,但缺点是必须手动计算每个承诺的时间。我更喜欢这种方法,因为它的明确性和可以说更好的设计


作为警告,由于附加了拒绝处理程序,你必须100%确定你正在添加你自己的
。catch
然后
处理程序,否则错误将不会记录到控制台。

你做了两条评论,当承诺失败但没有提到什么是
SQL
,如果
request.query
可以取消

在for循环中,您已经运行了所有的
request.query
语句,如果您只想运行一个查询,然后再运行另一个查询,则必须执行
request.query(query)。然后(=>request.query(query))。然后…
,但这将花费更长的时间,因为您不会一次启动所有查询

下面的代码可以告诉您所有查询花费了多长时间,但我认为您应该告诉我们什么是
SQL
,这样我们就可以知道如何设置连接池和缓存(可能是最大的性能增益)

//删除了异步,此函数不等待任何操作
//因此,不需要异步
//已删除初始化请求,您可以重新使用在中创建的请求
//run函数,它可以节省总运行时的一些时间
//但不确定请求是否可以共享连接(在这种情况下)
//最好创建一对夫妇,并将其作为他们的
//连接可用(连接池)
const execQuery=(响应、查询、请求)=>
新承诺(
(解决、拒绝)=>
request.query(
查询
,(错误、结果)=>
(错误)
?拒绝(错误)
:解析(结果)
)
);
//保存失败的查询并使用Fail对象解决它们
const Fail=function(detail){this.detail=detail;};
//let request=new SQL.request();
const run=(numberOfTimes)=>{
const start=new Date().getTime();
const request=new SQL.request();
我保证(
(x=>{
for(设i=0;i