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调用了它,这可能吗?
该代码举例说明了一种可能的情况,以帮助检测错误,但它在其他情况下可能很有用,在其他情况下,可以通过设计调用函数,无论有没有等待。
不,这是不可能的(没有调试器)。无论如何,你的函数没有责任检查它的调用者做了什么。你应该始终回报你的承诺。
\n\n虽然您无法检查和验证调用者(或其调用者或 \xe2\x80\xa6)的代码(如果仅出于安全原因,或者也因为静态分析很困难),但您仍然可以动态观察您的承诺是否被等待。您所需要做的就是在.then()未立即调用该方法时发出警告:
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})();\nRun Code Online (Sandbox Code Playgroud)\n