为了账号安全,请及时绑定邮箱和手机立即绑定

如何在打字稿中使用promise.allSettled?

如何在打字稿中使用promise.allSettled?

一只名叫tom的猫 2023-08-18 17:27:11
Typescript 构建失败,因为它似乎不喜欢,Promise.allSetttled即使我已经设置了 ts config coilerOptions"lib": [ "ES2020.Promise" ],似乎 的响应promise.allSettled不包括resultor reason。运行 typescript build 时出现以下错误:Property 'reason' does not exist on type 'PromiseSettledResult<IMyPromiseResult>'.和Property 'value' does not exist on type 'PromiseRejectedResult'.我的代码块如下所示,正如您所看到的,我正在尝试访问reason每个result已解决的承诺。const myPromise = async () : Promise<IMyPromiseResult> {  return new Promise((resolve) => {    resolve("hello world")  })}const data = await Promise.allSettled([  myPromise()]);const response = data.find(res => res.status === 'fulfilled')?.result;if(!response) {  const error = data.find(res => res.status === 'rejected')?.reason;  throw new Error(error);}如何更新 Promise.allSettled 声明以包含正确的接口?
查看完整描述

5 回答

?
慕桂英546537

TA贡献1848条经验 获得超10个赞

使用类型保护。比内联类型保护更优雅的解决方案是将它们定义为单独的函数,并且通过泛型绑定,您也可以获得已实现的承诺的正确值,并且可以重用以满足任何过滤需求allSettled

不需要铸造(通常应该避免)。

const isRejected = (input: PromiseSettledResult<unknown>): input is PromiseRejectedResult => 

  input.status === 'rejected'


const isFulfilled = <T>(input: PromiseSettledResult<T>): input is PromiseFulfilledResult<T> => 

  input.status === 'fulfilled'


const myPromise = async () => Promise.resolve("hello world");


const data = await Promise.allSettled([myPromise()]);


const response = data.find(isFulfilled)?.value

const error = data.find(isRejected)?.reason


查看完整回答
反对 回复 2023-08-18
?
慕森卡

TA贡献1806条经验 获得超8个赞

TypeScript 在检查类型时不知道类型是否为PromiseFulfilledResult/ PromiseRejectedResult。


唯一的办法就是铸造承诺的结果。之所以可以这样做,是因为您已经验证了已解决的承诺已实现或已拒绝。


看这个例子:


const myPromise = async (): Promise<string> => {

  return new Promise((resolve) => {

    resolve("hello world");

  });

};


const data = await Promise.allSettled([myPromise()]);


const response = (data.find(

  (res) => res.status === "fulfilled"

) as PromiseFulfilledResult<string> | undefined)?.value;


if (!response) {

  const error = (data.find(

    (res) => res.status === "rejected"

  ) as PromiseRejectedResult | undefined)?.reason;

  throw new Error(error);

}


查看完整回答
反对 回复 2023-08-18
?
慕村225694

TA贡献1880条经验 获得超4个赞

使用类型保护:


const isFulfilled = <T,>(p:PromiseSettledResult<T>): p is PromiseFulfilledResult<T> => p.status === 'fulfilled';

const isRejected = <T,>(p:PromiseSettledResult<T>): p is PromiseRejectedResult => p.status === 'rejected';


const results = await Promise.allSettled(...);

const fulfilledValues = results.filter(isFulfilled).map(p => p.value);

const rejectedReasons = results.filter(isRejected).map(p => p.reason);


查看完整回答
反对 回复 2023-08-18
?
动漫人物

TA贡献1815条经验 获得超10个赞

这让ts不生气。


const rawResponse = await Promise.allSettled(promiseArray);

const response = rawResponse.filter((res) => res.status === 'fulfilled') as PromiseFulfilledResult<any>[];


const result = response[0].value


查看完整回答
反对 回复 2023-08-18
?
长风秋雁

TA贡献1757条经验 获得超7个赞

将回调定义find为类型保护,返回类型谓词:


type IMyPromiseResult = string


const response = data.find(

  (res): res is PromiseFulfilledResult<string> => res.status === 'fulfilled'

)?.value;


if (!response) {

  const error = data.find(

    (res): res is PromiseRejectedResult => res.status === 'rejected'

  )?.reason;

  throw new Error(error);

}

演示游乐场


查看完整回答
反对 回复 2023-08-18
  • 5 回答
  • 0 关注
  • 178 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信