Правильный способ вернуть обещание из функции onCall в firebase? - PullRequest
1 голос
/ 25 апреля 2020

Согласно документам, которые я прочитал, функция onCall должна возвращать обещание. Примерно так:

...onCall((data, context) => {
    return db.collection('game').doc(game_id).delete();
});
...

Это просто берет обещание, связанное с функцией delete, и возвращает его вызывающей стороне.

Однако, если я хочу сделать дополнительный шаг после удаления то есть несколько путей возврата, и мне не ясно, что возвращать:

...onCall((data, context) => {
    return db.collection('game').doc(game_id).delete()
        .then(){
            return db.collection('user').doc(user_id).delete()
        }
        //.catch(){ return ??? }
});
...

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

Нужно ли мне создавать свой собственный объект Promise и сам вызывать resolve или reject?

Ответы [ 2 ]

2 голосов
/ 25 апреля 2020

Так оно и есть. Вам почти никогда не нужно создавать новое обещание. Это для случаев, когда вы вызываете функцию, которая не возвращает обещание, а вместо этого предоставляет обратный вызов.

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

1 голос
/ 25 апреля 2020
...onCall((data, context) => {
return db.collection('game').doc(game_id).delete()
    .then(){
        return db.collection('user').doc(user_id).delete()
    }
    //.catch(){ return ??? } });

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

В этом коде есть Цепочка обещаний с методом then(). Поскольку вызов promise.then() возвращает обещание, первый return возвращает обещание, и, следовательно, для функции вызываемого облака это нормально.

Однако, чтобы ответить на конец вашего вопроса, вам следует обратите внимание, что:

  1. Если при удалении игры возникнет ошибка, CF остановится и ни игра, ни пользователь не будут удалены
  2. Если у пользователя возникла ошибка удаление, CF остановится и игра будет удалена (успешно удалена до ошибки), но не пользователя.

Если вы хотите быть уверены, что оба будут удалены в одной операции atomi c ( оба удалены или ни один не удален), вы должны использовать пакетную запись следующим образом:

...onCall((data, context) => {


       let batch = db.batch();

       const gRef = db.collection('game').doc(game_id);
       batch.delete(gRef);

       const uRef = db.collection('user').doc(user_id);
       batch.delete(uRef);

       return batch.commit()

});
...