4 回答
TA贡献1874条经验 获得超12个赞
在过滤器承诺数组的情况下出现相同的错误:
const promises = ids.map((id) => <some BE API call>);
const resolvedPromises = await Promise.allSettled(promises);
resolvedPromises.filter(({ status }) => status === 'fulfilled').map((p) => p.value);
问题是allSettledreturns PromiseSettledResult,它根本没有导出(我在 lib.es2020.promise 中使用tsconfig):
interface PromiseFulfilledResult<T> {
status: "fulfilled";
value: T;
}
interface PromiseRejectedResult {
status: "rejected";
reason: any;
}
type PromiseSettledResult<T> = PromiseFulfilledResult<T> | PromiseRejectedResult;
并且.map不明白所有的rejected承诺都在filtered方法中被过滤了。
所以,我什至无法导入类型并将值转换为它们。
作为临时解决方案,我用注释抑制了 ESLint 和 TSC 规则:
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
然后我PromiseFulfilledResult在项目中创建了相同的接口并使用了类型转换:
resolvedPromises.filter(({ status }) => status === 'fulfilled').map((p) => (p as PromiseFulfilledResult).value);
结果我摆脱了 on error 和 ESLint/TS rules ignoring comments。
TA贡献1818条经验 获得超8个赞
你只有一个状态满足的值属性,而你没有检查它。
所以使用我自己的例子,它可以固定如下:
const p1 = Promise.resolve(50);
const p2 = Promise.resolve(100);
const promiseArray = [p1, p2];
Promise.allSettled( promiseArray ).
then( results => results.forEach( result =>
console.log(result.status,
result.status === 'fulfilled' && result.value
);
));
它现在验证承诺是否已实现,然后打印值(如果是的话)。
TA贡献1835条经验 获得超7个赞
如果在调用该方法后进行类型声明,则可以避免此错误allSettled。例如,您可以立即为打字稿输入一个类型,如下所示:
const promises = await Promise.allSettled([
fetch(url).then((response) => response.json()),
fetch(url).then((response) => response.json()),
]) as {status: 'fulfilled' | 'rejected', value: SomeType}[];
之后它将正常工作:
const resolvedPromises = promises.filter(({ status }) => status === 'fulfilled');
const responses = resolvedPromises.map((promise) => promise.value);
TA贡献1836条经验 获得超13个赞
您可以只键入 cast 的结果Promise.allSettled,例如:
const [
someData,
otherData
] = (await Promise.allSettled([
this.someRepository.count(),
this.otherRepository.count(),
])) as PromiseFulfilledResult<number>[];
// will verify the promises, but ts doesn't get it
this.verify(someData, otherData)
console.log(otherData.value) // ts is okay
Number 是从 promise 返回的类型,如果你想用不同的类型输入 promises,你也可以使用[PromiseFulfilledResult<number>, PromiseFulfilledResult<string>]
添加回答
举报