如何判断是否已使用await调用异步函数

时间:2018-03-15 10:36:25

标签: javascript node.js asynchronous

async function sleep(msecs){

    if (!somebodyAwaitsMe())            // that's the unknown
        throw ("call me with await");

    return new Promise(resolve => setTimeout(resolve, ms));
}

await sleep(5000);                    // correct

sleep(5000);                     // forgot await, returns immediately,

我想知道,在async函数中,如果已经等待或不调用,那可能吗?

该代码举例说明了可能的情况,以帮助检测错误,但它可能在其他情况下有用,其中一个函数可以通过设计调用,无论是否等待。

1 个答案:

答案 0 :(得分:4)

不,这是不可能的(没有调试器)。无论如何,检查调用者的功能并不是你的功能的责任。你应该总是回报你的承诺。

如果仅出于安全原因,或者因为静态分析很困难,您无法检查和验证调用者(或其调用者或......)的代码,您仍然可以动态地观察您的承诺是否等待。您需要做的就是在未立即调用.then()方法时发出警告:

function expectMethodInvocation(o, p) {
    const t = setTimeout(() => {
        console.warn("You should call my "+p+" method!");
        delete o[p];
    }, 0);
    o[p] = function(...args) {
        clearTimeout(t);
        delete o[p];
        return o[p].call(this, ...args);
    };
    return o;
}

function sleep(ms) {
    const p = new Promise(resolve => setTimeout(resolve, ms));
    return expectMethodInvocation(p, "then");
}

(async function() {
    await sleep(1000);
    console.log("OK");
    sleep(1000); 
    console.log("Ooops");
})();