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

标签 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 函数内部,是否使用 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/

相关文章:

javascript - 在javascript中计算旋转矩形的中点

javascript - NodeJS - 从 Google Drive 下载

javascript - 使用加密nodejs解密大文件

node.js - Sequelize : How to query a parent column by the sum of an associated table's column

scala - Play 2.0 Framework (scala) 中的异步结果

javascript - 使用css在div中只显示一部分图像

javascript - 奇怪的javascript变量转储

javascript - 生成指定范围内的随机数——各种情况(int、float、inclusive、exclusive)

jquery - 如何使用通过 jQuery.get 调用获得的 URL 来执行另一个调用?

ios - 如何同时执行多个异步方法并在它们全部完成时获得回调?