Итерация по вложенному массиву объектов, который определен как Обещание - PullRequest
0 голосов
/ 17 января 2020

Я использую 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. Они являются Обещанием, потому что TypeORM выполняет асинхронный вызов, чтобы также извлечь их из другой таблицы базы данных, на которую ссылается идентификатор.

Когда я выполняю вызов GraphQL на сервер, он возвращает ParentObject's как массив, и я Я могу перебирать каждый из них с кодом, подобным следующему:

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

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

return data;

Я могу изменить значения и т. д. c.

Но моя проблема заключается в возможности перебирать nestedObject в пределах ParentObject. Учитывая, что они объявлены как Promise<NestedObject[]>, это не стандартный массив и не содержит таких функций, как map или pu sh.

Так что я бы использовал такой код:

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[]>'

, из-за которой я не могу перебирать этот вложенный массив объектов, так как это не простой массив, а скорее обещание вложенного массива объектов. Я не уверен, как решить эту проблему.

Любая помощь будет принята с благодарностью, спасибо.

1 Ответ

0 голосов
/ 17 января 2020

Просто await Обещание, тогда вы можете обращаться к массиву и манипулировать им, как обычно.

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

Обратите внимание, что поскольку функция, которую мы передаем data.map, теперь async, data.map теперь будет возвращать массив Обещаний. Это прекрасно, так как вы можете вернуть это внутри вашего резольвера, и GraphQL с этим справится. Однако, если по какой-то причине вам нужно манипулировать переменной data перед ее возвратом, вам также нужно ее дождаться. Однако для ожидания массива обещаний вы должны использовать Promise.all:

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