Добавление данных в объект является потокобезопасным при использовании обещаний? - PullRequest
0 голосов
/ 29 января 2020

Я пишу облачную функцию firestore, используя TS для доступа к базе данных fireStore. Функция выполняет итерацию всех документов внутри коллекции, затем получает данные из каждого документа и, наконец, добавляет данные в простой объект. Я не уверен на 100%, является ли эта операция потокобезопасной. Если бы это было написано на других языках, мне нужно что-то вроде ConcurrentHashMap. Вот исходный код:

export async function readAllDocuments(): Promise<{ [key: string]: any }> {
  const result: { [key: string]: any } = {};
  const collectionRef = admin.firestore().collection("test");
  const listRef = await collectionRef.listDocuments();
  const readPromises = listRef.map(async (documentRef) => {
    return documentRef.get().then((doc) => {
      result[doc.id] = doc.data(); // Is this thread safe?
    })
  });
  await Promise.all(readPromises);

  return result;
}

Ответы [ 2 ]

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

Да, вы должны быть в порядке с кодом, который вы написали. Ваш код использует метод, который будет работать синхронно в вашей системе. Кроме того, как JavaScript, так и облачные функции используют асинхронную обработку, что упрощает управление.

Я бы порекомендовал вам взглянуть на приведенную ниже документацию из облачных функций, о облачных функциях и о том, как улучшить используйте синхронный стиль веб-хука при обработке данных.

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

В JavaScript нет потоков, только асинхронная обработка. Но если, говоря потокобезопасно, вы хотите спросить, будет ли этот код выполняться без возврата Promise . Да, он будет работать нормально, потому что, даже если вы работаете в асинхронном c контексте, указанный c метод ...data() является синхронной функцией.

...