在 React Hook 中汇总来自多个 Promise 的结果
Aggregate results from multiple Promises in React Hook
我正在尝试从 React 挂钩中的多个承诺中获得组合结果。
但是当我使用钩子时,函数 getAll
立即 returns 为空,而不是返回所有 MyType
s.
我的钩子:(api.get
returns a Promise<MyType[]>
)
function useMyHook() {
const api = useApiService();
return {
getAll,
};
function getAll(arr: number[]): MyType[] {
const results: MyType[] = [];
for (const u of arr) {
api.get(u).then((res) => {
results.push(...res);
});
}
return [...new Set(results)];
}
}
用法:
function MyComponent() {
// ...
const myHook= useMyHook();
const use = () => {
// ...
const numbers = [1, 2, 3];
const myTypes = myHook.getAll(numbers);
const count = myTypes.length; // this will always be 0
// ...
};
}
我怎样才能完成这项工作?我尝试了多个带有 promise 链和 async/await 的版本,但无济于事。
由于 api.get
return 是一个承诺,getAll
也需要 return 一个承诺。它不能 return 一个 MyType[]
,因为 assemble 该数组需要时间。我会使用 Promise.all 创建一个新的承诺,它将等待各个承诺,然后用一些代码来组合结果。
与async/await:
function async getAll(arr: number[]): Promise<MyType[]> {
const promises: Promise<MyType[]>[] = [];
for (const u of arr) {
promises.push(api.get(u));
}
const results = await Promise.all(promises);
// results is an array of arrays, so we need to flatten it
return [...new Set(results.flat())];
}
// used like:
const use = async () => {
// ...
const numbers = [1, 2, 3];
const myTypes = await myHook.getAll(numbers);
const count = myTypes.length;
// ...
};
或者,如果您更喜欢使用 .then
:
function getAll(arr: number[]): Promise<MyType[]> {
const promises: Promise<MyType[]>[] = [];
for (const u of arr) {
promises.push(api.get(u));
}
return Promise.all(promises).then(results => {
// results is an array of arrays, so we need to flatten it
return [...new Set(results.flat())];
});
}
// used like:
const use = () => {
// ...
const numbers = [1, 2, 3];
myHook.getAll(numbers).then(myTypes => {
const count = myTypes.length;
// ...
});
};
我正在尝试从 React 挂钩中的多个承诺中获得组合结果。
但是当我使用钩子时,函数 getAll
立即 returns 为空,而不是返回所有 MyType
s.
我的钩子:(api.get
returns a Promise<MyType[]>
)
function useMyHook() {
const api = useApiService();
return {
getAll,
};
function getAll(arr: number[]): MyType[] {
const results: MyType[] = [];
for (const u of arr) {
api.get(u).then((res) => {
results.push(...res);
});
}
return [...new Set(results)];
}
}
用法:
function MyComponent() {
// ...
const myHook= useMyHook();
const use = () => {
// ...
const numbers = [1, 2, 3];
const myTypes = myHook.getAll(numbers);
const count = myTypes.length; // this will always be 0
// ...
};
}
我怎样才能完成这项工作?我尝试了多个带有 promise 链和 async/await 的版本,但无济于事。
由于 api.get
return 是一个承诺,getAll
也需要 return 一个承诺。它不能 return 一个 MyType[]
,因为 assemble 该数组需要时间。我会使用 Promise.all 创建一个新的承诺,它将等待各个承诺,然后用一些代码来组合结果。
与async/await:
function async getAll(arr: number[]): Promise<MyType[]> {
const promises: Promise<MyType[]>[] = [];
for (const u of arr) {
promises.push(api.get(u));
}
const results = await Promise.all(promises);
// results is an array of arrays, so we need to flatten it
return [...new Set(results.flat())];
}
// used like:
const use = async () => {
// ...
const numbers = [1, 2, 3];
const myTypes = await myHook.getAll(numbers);
const count = myTypes.length;
// ...
};
或者,如果您更喜欢使用 .then
:
function getAll(arr: number[]): Promise<MyType[]> {
const promises: Promise<MyType[]>[] = [];
for (const u of arr) {
promises.push(api.get(u));
}
return Promise.all(promises).then(results => {
// results is an array of arrays, so we need to flatten it
return [...new Set(results.flat())];
});
}
// used like:
const use = () => {
// ...
const numbers = [1, 2, 3];
myHook.getAll(numbers).then(myTypes => {
const count = myTypes.length;
// ...
});
};