簡體   English   中英

迭代定義為 Promise 的嵌套對象數組<Object[]>

[英]Iterating over nested array of objects that is defined as a Promise<Object[]>

我正在使用 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<NestedObject[]> ,它不是標准的 Array 並且不包含諸如 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;

我收到打字稿錯誤:

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

這讓我無法迭代這個嵌套的對象數組,因為它不是一個簡單的數組,而是一個嵌套對象數組的承諾。 我不知道如何處理這個問題。

任何幫助將不勝感激,謝謝。

只需await Promise,然后您就可以像平常一樣訪問和操作數組。

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

請注意,因為我們傳遞給data.map的函數現在是asyncdata.map現在將返回一個data.map數組。 這很好,因為您可以在解析器中返回它,GraphQL 會適當地處理它。 但是,如果出於某種原因需要在返回data變量之前對其進行操作,則還需要等待它。 但是,要等待一系列Promise.all ,您可以使用Promise.all

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM