【问题标题】:Detect Javascript/ECMAScript await misuse?检测 Javascript/ECMAScript 等待滥用?
【发布时间】:2020-03-20 03:46:56
【问题描述】:

Javascript 或 Typescript 生态系统中是否有工具可以检测同步函数上 await 的(错误/过度)使用? (例如 tslint 规则)

当我错误地使用await作为同步函数的结果时,问题就出现了,

const decoded = await jsonwebtoken.verify(session, publicKey, opts);

我的 linter,默认的 gts tslint,没有捕捉到。代码奇怪地工作(await 默默地传递非承诺?),但我想标记滥用以鼓励使用异步/回调选项。

我原以为这样滥用await会触发Typescript错误,但tscts-jest通过了以下测试:

test('Demonstrate await', async () => {
  function foo(): number { return 4; }
  const food = await foo(); // Even replace foo() with a constant or literal.
  expect(food).toBe(4);
});

【问题讨论】:

标签: javascript async-await eslint tslint


【解决方案1】:

如果等待的表达式不是一个promise,那么它被包裹在一个promise中,然后被等待。

意味着您可以放置​​对象、函数甚至原语,这将被视为一个承诺。

编辑源代码 - 在此处查看此讨论:https://github.com/Microsoft/TypeScript/issues/8310

【讨论】:

  • 记得链接到一个或多个支持此类声明的来源。否则人们不得不相信你的话,这不是很好。
  • 请注意,这实际上并不是一个很好的链接来支持await 以特定方式运行的说法:它只是一个关于打字稿应该做什么的讨论线程,没有任何官方文档的链接来解释await 必须如何根据 await 关键字的规范来表现。
【解决方案2】:

await 作用于表达式。当表达式是一个 Promise 时,异步函数的评估会暂停,直到 Promise 被解决。当表达式为非 Promise 值时,使用 Promise.resolve 将其转换为 Promise,然后解析。

【讨论】:

    【解决方案3】:

    JSawait:

    如果await 运算符后面的表达式的值不是Promise,则将其转换为已解析的Promise

    所以这并没有什么问题,它可能对测试有用,也可能在实时代码中有用。

    【讨论】:

      【解决方案4】:

      是的,如果您使用类型系统,则可以强制执行类似的 linter 规则。对于 TSlint,您可以使用如下内容:

      https://palantir.github.io/tslint/rules/await-promise/

      【讨论】:

        猜你喜欢
        • 2022-01-04
        • 2021-07-14
        • 1970-01-01
        • 2021-09-15
        • 1970-01-01
        • 2021-05-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多