我对 Promise 有点陌生,我对如何编写正确的代码感到困惑。 该程序正在做什么:
代码:
public getItemByIdWithoutItemtype(itemId: string): Promise<ItemTypeName> {
return this.getItemTypes().then(itemtypes => {
const calls = itemtypes.map(itemtype => {
return this.getItemById(itemtype.name, itemId).then(value => {
if (value !== undefined) {
// There is an item of this type with this id
return itemtype.name as ItemTypeName;
}
});
});
return Promise.all(calls);
});
}
Typescript 不会编译此代码,表示
Type 'Promise<ItemTypeName | (ItemTypeName | undefined)[]>' is not assignable to type 'Promise<ItemTypeName>'.
基本上,我认为没有找到任何东西的情况没有得到正确的处理。但我不知道如何写这个。有人可以帮忙吗?
编辑:
如果我使用像这样的中间变量,TypeScript 就可以了:
public getItemByIdWithoutItemtype(itemId: string): Promise<ItemTypeName> {
return this.getItemTypes().then(itemtypes => {
let itemtypename;
const calls = itemtypes.map(itemtype => {
return this.getItemById(itemtype.name, itemId).then(value => {
if (value !== undefined) {
// There is an item of this type with this id
return itemtype.name as ItemTypeName;
}
});
});
return Promise.all(calls).then(itemtypename);
});
}
我必须测试一下。
正如其他评论者所指出的,目前尚不清楚该功能的目的是什么。此外,使用 async/await 来表达它可能更简单,这是围绕 Promise 的语法糖。
最后,总是存在根本找不到任何项目的情况,因此函数签名应该用
Promise<ItemTypeName | undefined>
来解释这一点
这也许可以帮助您朝着正确的方向进一步前进(未经测试):
public async getItemByIdWithoutItemtype(
itemId: string,
): Promise<ItemTypeName | undefined> {
const itemTypes = await this.getItemTypes();
const calls = await Promise.all(
itemTypes.map(async (itemType) => {
const foundItem = this.getItemById(itemtype.name, itemId);
if (foundItem !== undefined) {
return itemType.name;
}
return undefined;
})
);
return calls.find((value) => value !== undefined);
}