【发布时间】:2020-09-10 06:48:42
【问题描述】:
我已经创建了函数,它应该接受 Promises 数组,并且只返回已解决的 Promises。必须忽略错误。所以,它看起来像 Promise.all 但没有错误。问题是在打字稿中正确编写函数。之前,只使用 JS,我有预期的结果。
function promiseIgnoreErrors<T> (arrayOfPromise: Array<T>) {
const isArrayEmpty =
Array.isArray(arrayOfPromise) && arrayOfPromise.length === 0;
return new Promise((resolve, reject) => {
if (isArrayEmpty) reject(new Error('Forever pending array'));
let resolvedArray: Array<T> = []
let resolvedCounter: number = 0;
arrayOfPromise.forEach((promise, index) => {
if (promise instanceof Promise) {
promise
.then((data) => {
resolvedArray[index] = data
resolvedCounter++;
if (arrayOfPromise.length === resolvedCounter) resolve(resolvedArray)
})
.catch(() => {
resolvedCounter++;
if (arrayOfPromise.length === resolvedCounter) resolve(resolvedArray)
})
} else {
resolvedArray[index] = promise
resolvedCounter++;
if (arrayOfPromise.length === resolvedCounter) resolve(resolvedArray)
}
})
});
};
问题的简短介绍。我的变量:
const p1 = new Promise((resolve) => setTimeout(() => resolve('JS'), 500))
const p2 = 22
const p3 = new Promise((reject) => setTimeout(() => reject(new Error('Oops')), 100))
const p4 = new Promise((resolve) => setTimeout(() => resolve('TS'), 200))
当我有变量并将它们作为数组传递时,
promiseIgnoreErrors([p1, p2, p3, Promise.reject(10), p4])
我希望:
Promise {<pending>}
[[PromiseState]]: "fulfilled"
[[PromiseResult]]: Array(3)
// ['JS', 22, 'TS']
现在我有:
Promise {<pending>}
[[PromiseState]]: "fulfilled"
[[PromiseResult]]: Array(5)
// ['JS', 22, Error: 'Oops, ?, 'TS']
您可以在控制台中显示我的问题: Playground
我认为这里的问题是泛型类型,正是这一行:
let resolvedArray: Array<T> = []
因为它表明返回的表必须包含与输入中相同的元素。也许它应该类似于:
let resolvedArray: Array<K> extends T = []
我当然知道上面这行是错的,但也许我应该遵循这个想法.. 或者我的功能不正常?
请任何帮助!
【问题讨论】:
-
类型对运行时发生的事情没有影响,如果您得到错误的输出,则 code 是错误的。
-
reject(new Error('Forever pending array'));在我看来确实是个错误。但说真的,你为什么还要自己写这个而不是使用Promise.allSettled? -
@jonrsharpe 我明白了。无论如何,谢谢!
-
代码中的一个问题是
new Promise((reject) => setTimeout(() => reject(new Error('Oops')), 100))完全等同于new Promise((resolve) => setTimeout(() => resolve(new Error('Oops')), 100))。您可能打算使用new Promise((resolve, reject) => …)。 -
@Bergi 我注意到了。当我测试我的代码时出现问题。然后当我有
new Promise((resolve, reject) => setTimeout(() => reject(new Error('Oops')), 100))时,打字稿对我大喊大叫,因为我不使用“解决”.. 我的测试自动失败。
标签: javascript typescript promise typescript-generics