Почему Firestore / AngularFire SDK упаковывает несколько обещаний в один запрос? - PullRequest
0 голосов
/ 24 декабря 2018

Вот как я пишу документ и его подколлекции:

 public async setEvent(event: EventInterface): Promise<void[]> {
    return new Promise<void[]>(async (resolve, reject) => {
      const writePromises: Promise<void>[] = [];
      event.setID(event.getID() || this.afs.createId());
      event.getActivities()
        .forEach((activity) => {
          activity.setID(activity.getID() || this.afs.createId());
          writePromises.push(this.afs.collection('events').doc(event.getID()).collection('activities').doc(activity.getID()).set(activity.toJSON()));
          activity.getAllStreams().forEach((stream) => {
            this.logger.info(`Steam ${stream.type} has size of GZIP ${getSize(this.getBlobFromStreamData(stream.data))}`);
            writePromises.push(this.afs
              .collection('events')
              .doc(event.getID())
              .collection('activities')
              .doc(activity.getID())
              .collection('streams')
              .doc(stream.type) // @todo check this how it behaves
              .set({
                type: stream.type,
                data: this.getBlobFromStreamData(stream.data),
              }))
          });
        });
      try {
        await Promise.all(writePromises);
        await this.afs.collection('events').doc(event.getID()).set(event.toJSON());
        resolve()
      } catch (e) {
        Raven.captureException(e);
        // Try to delete the parent entity and all subdata
        await this.deleteEvent(event.getID());
        reject('Something went wrong')
      }
    })
  }

Однако, когда я смотрю на вкладку сети:

enter image description here

Я вижу, что один запрос запускается, пока все хорошо, req_0 данные мои activity, но, глядя на этот же запрос, я вижу:

enter image description here

Таким образом, он добавляет больше данных, и этого не должно произойти, потому что: a) я передаю размер запроса в хранилище (1mb) b) из-за медленного соединения я пропускаю ограничение по времени для записи.

Самое интересное, что такое происходит, когда у меня медленная сеть.

РЕДАКТИРОВАТЬ: Вот полезная нагрузка примера запроса:

enter image description here

Кто-нибудь, объясните, почему это?

Ответы [ 2 ]

0 голосов
/ 06 января 2019

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

Минимизация сетевого ввода-вывода экономит время автономной работы (как указано выше), и это на самом деле главная проблема.

"Волшебство" происходит под капотом

0 голосов
/ 04 января 2019

Может быть, речь идет о «потоке».Потоковый файл, это своего рода вы не загружаете полный файл в оперативную память и читаете их построчно в поисках запроса.Я уверен, что в языке Java это работает, например, когда вы создаете очередь потока, этот поток переходит в отдельный поток и работает там, используя один или несколько потоков (создавая их самостоятельно).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...