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 函数内部,是否使用 await 调用它,这可能吗?
该代码举例说明了一种可能的情况,以帮助检测错误,但它可能在其他情况下也很有用,在这些情况下,可以通过设计调用函数,无论是否等待。
最佳答案
不,这是不可能的(没有调试器)。无论如何,检查其调用者的行为不是您的函数的责任。你应该总是返回你的 promise 。
虽然您无法检查和验证您的调用者(或其调用者或...)的代码,如果仅出于安全原因,或者也因为静态分析很难,您仍然可以动态观察您的 promise 是否等待。您需要做的就是在 .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");
})();
关于javascript - 如何判断是否已使用 await 调用异步函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49297200/