我有一个基于异步的代码库,需要与一些"基于回调"的外部库进行交互.

export function externalApi(onsuccess: (response: string) => void): void {
    // stuff
    onsuccess('response');
}

export async function myWrapper(): Promise<string> {
    return await new Promise((resolve) => externalApi(resolve));
}

我的怀疑是

  • myWrapper await应该兑现promise 吗?或者它应该立即停止?
  • 如果没有await,该函数是否应标记为async
  • 写这await new Promise(...)篇文章有什么惩罚吗?

推荐答案

myWrapper await应该兑现promise 吗?还是应该立即归还?

这取决于你.没有必要在async函数的顶层执行return await,但might通过在异步堆栈跟踪中包含async函数,使异步堆栈跟踪更清晰.因此,您可以出于这个原因保留它,也可以出于这个原因删除它.:-)(我应该注意到,在最新的V8中,我再也看不到堆栈跟踪的区别了,两者都包括包装器函数.因此,在这方面,事情可能已经有所进展;我知道异步堆栈跟踪在一段时间内是一个热门的开发领域.)

如果没有await,该函数是否应标记为async

不,如果你go 掉await,就没有理由变成async.

写这篇等待新promise 的文章有什么惩罚吗东西

如果你特别指的是return await中的await,那么不是,当你使用await的promise 是一个本地promise 时.它曾经在async函数promise 的解决方案中引入了一个(基本上无害的)异步勾号,但该规范被更新以允许引擎避免它.


如果你想捕捉函数中promise 的拒绝,或者你想在finally子句中做一些事情,或者类似的事情——任何async函数的逻辑依赖于在async函数本身返回之前解决promise 的事情,在async函数is的顶层使用return await not是必要的.例如,你需要它在这里:

async function example() {
    try {
        return await somethingThatProvidesAPromise();
    } catch (e) {
        throw new WrapperError(e);
    }
}

这里呢

async function example() {
    const lock = acquireLock();
    try {
        return await doSomethingWith(lock);
    } finally {
        releaseLock(lock); // (Where `releaseLock` guarantees it nevers throws)
    }
}

如果没有await,这两个都不正确.

Typescript相关问答推荐

在TypScript中的同一数组中验证不同类型

Angular 垫页分类和垫排序不起作用

如何将绑定到实例的类方法复制到类型脚本中的普通对象?

根据另一个成员推断类成员的类型

如何正确修复TypScript 4.7到4.8升级中的TS 2345编译错误

如何在方法中定义TypeScript返回类型,以根据参数化类型推断变量的存在?

TypeScript实用程序类型—至少需要一个属性的接口,某些指定属性除外

如何推断哪个特定密钥与泛型匹配?

Express Yup显示所有字段的所有错误

类型脚本返回的类型包含无意义的泛型类型名称

为什么我的条件类型不能像我预期的那样工作?

如何使默认导出与CommonJS兼容

以Angular 执行其他组件的函数

如何使这种一对一关系在旧表上起作用?

如何在Reaction 18、Reaction-Rout6中的导航栏中获取路由参数

如何静态键入返回数组1到n的函数

字幕子集一个元组的多个元素

在类型脚本中创建显式不安全的私有类成员访问函数

是否可以定义引用另一行中的类型参数的类型?

如何使用useSearchParams保持状态