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

tru*_*ru7 1 javascript asynchronous node.js

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,
Run Code Online (Sandbox Code Playgroud)

我想知道,在异步函数中,是否使用await调用了它,这可能吗?

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

Ber*_*rgi 5

不,这是不可能的(没有调试器)。无论如何,你的函数没有责任检查它的调用者做了什么。你应该始终回报你的承诺。

\n\n

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

\n\n
function expectMethodInvocation(o, p) {\n    const t = setTimeout(() => {\n        console.warn("You should call my "+p+" method!");\n        delete o[p];\n    }, 0);\n    o[p] = function(...args) {\n        clearTimeout(t);\n        delete o[p];\n        return o[p].call(this, ...args);\n    };\n    return o;\n}\n\nfunction sleep(ms) {\n    const p = new Promise(resolve => setTimeout(resolve, ms));\n    return expectMethodInvocation(p, "then");\n}\n\n(async function() {\n    await sleep(1000);\n    console.log("OK");\n    sleep(1000); \n    console.log("Ooops");\n})();\n
Run Code Online (Sandbox Code Playgroud)\n