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函数中,如果已经等待或不调用,那可能吗?
该代码举例说明了可能的情况,以帮助检测错误,但它可能在其他情况下有用,其中一个函数可以通过设计调用,无论是否等待。
答案 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");
})();