【问题标题】:Iterating over nested array of objects that is defined as a Promise<Object[]>迭代定义为 Promise<Object[]> 的嵌套对象数组
【发布时间】:2020-05-04 05:54:27
【问题描述】:

我正在使用 typeORM 来声明数据模型。

看起来像这样:

@ObjectType()
@Entity("ParentObject")
@Index(['id'], { unique: true })
export class ParentObject {
  @Field({nullable: true})
  @PrimaryGeneratedColumn("uuid")
  uuid: string; 

  @Field(type => [NestedObject], {nullable: true})
  @OneToMany(type => NestedObject, nestedObject=> nestedObject.parentObject)
  nestedObjects: Promise<NestedObject[]>;

  @Column({
     nullable: true,
     type: 'timestamp'
  })
  @Field(() => GraphQLISODateTime, {nullable: true})
  @CreateDateColumn()
  createdDate: Date;

    }

NestedObject 数组包含与 ParentObject 一起拉出的对象。它们是一个 Promise,因为 TypeORM 进行了一个异步调用以将它们从另一个数据库表中提取出来,由 ID 引用。

当我对服务器进行 GraphQL 调用时,它会以数组的形式返回 ParentObject,我可以使用如下代码遍历每个对象:

let data = await this.service.getParentObject(first, offset);

data = data.map((parentObject: ParentObject) => {
    return ParentObject.someFunction(parentObject);
});

return data;

我可以修改值等。

但我的问题是能够遍历 ParentObject 中的nestedObject。鉴于它们被声明为Promise&lt;NestedObject[]&gt;,它不是一个标准的数组,并且不包含诸如map或push之类的函数。

所以我会使用这样的代码:

let data = await this.service.getParentObject(first, offset);

data = data.map((parentObject: ParentObject) => {
   let nestedObjects = parentObject.nestedObjects;
    nestedObjects.map(nestedObject=> {
        // some operations
    })
    return ParentObject.someFunction(parentObject);
});

return data;

我收到 Typescript 错误:

Property 'map' does not exist on type 'Promise<NestedObject[]>'

这让我无法遍历这个嵌套的对象数组,因为它不是一个简单的数组,而是一个嵌套的对象数组的承诺。我不确定如何处理这个问题。

任何帮助将不胜感激,谢谢。

【问题讨论】:

  • 我对打字稿了解不多,但是Array.from 是一个选项吗?这是将类数组结构转换为数组的常用方法,可让您访问所有数组方法,如 map foreach

标签: javascript typescript promise graphql typeorm


【解决方案1】:

只需await Promise,您就可以像平常一样访问和操作数组。

data = data.map(async (parentObject: ParentObject) => {
    const resolvedPromise = await parentObject.nestedObjects
    parentObject.nestedObjects = resolvedPromise.map(nestedObject=> {
        // some operations
    })
    ...
});

请注意,因为我们传递给data.map 的函数现在是async,所以data.map 现在将返回一个Promise 数组。这非常好,因为您可以在解析器中返回它,GraphQL 会适当地处理它。但是,如果由于某种原因您需要在返回 data 变量之前对其进行操作,那么您也需要等待它。但是,要等待一系列 Promise,您可以使用 Promise.all

data = await Promise.all(data.map(async () => {...}))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-06
    • 1970-01-01
    相关资源
    最近更新 更多