首页 > 解决方案 > 节点测量执行时间 - 从作为参数传递给另一个函数的异步返回值

问题描述

我想编写一个函数来测量可能返回值的部分代码(其他方法)的性能。这是我此刻出来的:

const fn = async (): Promise<any> => {
    setTimeout(async (): Promise<any> => {
        return new Promise((resolve) => resolve('Hello World!'));
    }, 3000);
};

async measure(fn: () => Promise<any>): Promise<any> {
    const startTime = this.performance.now();
    const result = await functionToMeasure();
    const endTime = this.performance.now();

    const executionTime = endTime - startTime;
    console.log(`Executed in ${executionTime} ms`);

    return result;
}

const result = async measure(functionToMeasure); // result is undefined

结果是functionToMeasure实际运行但它从不返回任何东西,目前我只能将它与void函数一起使用。

如果可能的话,我想修复它,或者如果有更好的方法,我可以完全改变它。

编辑:

实际代码

const callback = async (): Promise<any> => {
    return await doSomethingAndReturn();
};
const searchResults: string[] = await measure(callback);

我必须包装doSomethingAndReturn异步承诺吗?

标签: node.jstypescriptperformanceasynchronousasync-await

解决方案


您需要将setTimeout调用包装在一个 Promise 中,然后解析结果,所以它应该看起来像这样:

const {performance} = require('perf_hooks');

async function executeAndMeasure(fn) {
    const startTime = performance.now();
    const result = await fn();
    const endTime = performance.now();

    const executionTime = endTime - startTime;
    console.log(`Executed in ${executionTime} ms`);

    return result;
}

function someFnThatReturnsAPromise() {
    return new Promise(resolve => {
        setTimeout(() => {
            resolve("Hello World");
        }, 3000);
    })
}

async function someAsyncFunction() {
    return 123;
}

(async () => {
    let result = await executeAndMeasure(someFnThatReturnsAPromise);
    console.log(`result was ${result}`);
    result = await executeAndMeasure(someAsyncFunction);
    console.log(`result was ${result}`);
})();

推荐阅读