Облачный пожарный магазин не дожидается, пока возвращенное обещание закончится - PullRequest
0 голосов
/ 28 марта 2019

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

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

  1. Кажется, что функция не ждет, пока возвращенное обещание не будет выполнено. Перепроверка testProduct происходит до того, как обещание закончено. Не уверен, что так работает функция firestore.
  2. если я верну ноль в функции, данные 111 все равно будут обновлены. Мне кажется, что onWrite действительно не волнует, что происходит внутри тела?
  3. Я также пытаюсь вернуть результат ('status 200') с сервера, но, очевидно, клиентская сторона ничего не получает.

Ценю любую помощь по этому вопросу.

exports.updateProduct = functions.firestore.document('testProducts/1111').onWrite((change, context) => {
  const newValue = change.after.data();
  return admin.firestore().doc('testProducts/2222').update({
    description: newValue.name
  }).then((value) =>{
    console.log('Hello World');
    return 'status 200';
  });
});

1 Ответ

0 голосов
/ 28 марта 2019

Ваш код должен работать, но документ testProducts/2222 должен уже существовать в БД.Документ для метода update() гласит:

Обновление не будет выполнено, если его применить к документу, который не существует.

Вывызовет облачную функцию путем создания, изменения или удаления документа testProducts/1111, см. документ здесь: https://firebase.google.com/docs/functions/firestore-events.

onWrite: срабатывает при onCreate, onUpdate или onDelete срабатывает.


Однако вы можете немного изменить свой код таким образом, чтобы вместо этого возвращалось обещание, возвращаемое асинхронным методом update()значения.

exports.updateProduct =  functions.firestore.document('testProducts/1111').onWrite((change, context) => {
  const newValue = change.after.data();
  return admin.firestore().doc('testProducts/2222').update({
    description: newValue.name
  })
});

Обратите внимание, что при использовании облачной функции, запускаемой в фоновом режиме с триггером onWrite(), клиент не должен получать никакого ответа: процесс происходит в фоновом режиме.Поэтому 'status 200' никогда не возвращается клиенту, и если вы не отправляете новый запрос к базе данных, «последняя информация о '2222' не загружена».

Если вы хотите получить ответ на клиентеКроме того, вы можете:

  1. настроить прослушиватель с помощью метода onSnapshot(), чтобы прослушать изменения в документе testProducts/2222.С помощью прослушивателя «последняя информация о '2222'» будет автоматически «загружена» для повторного использования ваших слов.
  2. Используйте HTTP Cloud Function или Функция вызываемого облака , которую вы запускаете от клиента и которая отправляет ответ.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...