承诺和条件回报图

问题描述 投票:0回答:1

我对 Promise 有点陌生,我对如何编写正确的代码感到困惑。 该程序正在做什么:

  • 获取项目类型列表(通过承诺返回)
  • 对于所有这些项目类型,尝试查看该类型的其中一个项目是否具有给定的 ID(带有另一个承诺)
  • 如果是,则返回类型,如果不是,则不执行任何操作。

代码:

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);
    });
  }

我必须测试一下。

javascript typescript dictionary promise
1个回答
0
投票

正如其他评论者所指出的,目前尚不清楚该功能的目的是什么。此外,使用 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);
}
© www.soinside.com 2019 - 2024. All rights reserved.