Задача внутри облачных функций Для запуска аутентификации требуется асинхронизация? - PullRequest
0 голосов
/ 05 марта 2019

Заявление

Прежде всего позвольте мне сказать, что команда Firebase является лучшей.

Код

    //Firebase Cloud Functions
    const functions = require('firebase-functions');    
    // Firebase Admin SDK
    const admin = require('firebase-admin');
    admin.initializeApp(); //initialize the admin sdk
    //UUID
    const uuidv1 = require('uuid/v1');

    exports.setupProfile= functions.auth.user().onCreate((user) => {
         const email = user.email; // The email of the user.
         const displayName = user.displayName; // The display name of the us
         const pid = uuidv1(); // public id

         //**************** 
         //create a set of items visible to others
         return admin.database().ref('/users-public/' + pid).push({"displayName": displayName,"profile-pic-path":""});

         //user's private information
         return admin.database().ref('/users-private/' + user.uid).push({"displayName": displayName, "pid": pid,"email":email,"dob": "","address": "","age": "","zip-code":""});
         //****************         

    });

Чего я хочу достичь / понять

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

Что я понимаю до сих пор

Триггеры аутентификации, как и все другие фоновые функции, имеют асинхронное значение, если человек A и человек B регистрируются одновременно, и функция выше запускается для обоихни человек A, ни человек B не должны ждать завершения функции setupProfile другого человека.По сути, два разных потока.

Вопросы

  1. Должны ли линии между звездочками находиться внутри метода async (), чтобы весь этот процесс был действительно асинхронным, или это означало бы, что его помещениевнутри async () будет по существу порождать другой поток из запущенного потока?
  2. Не стоит ли мне беспокоиться о async (), потому что я должен думать о каждом триггере как о своем собственном потоке, поэтому любые задачи в этом триггере будут частью этогоодин поток (начальный триггер), и нет никакой дополнительной выгоды для порождения другого потока.Я должен просто вернуть обещание и назвать его днем.

Пожалуйста, дайте мне знать, если мне нужно кое-что прояснить.-LK

Рабочий код

const functions = require("firebase-functions");
const admin = require("firebase-admin");
admin.initializeApp(); //initialize the admi sdk
exports.setupProfile = functions.auth.user().onCreate((user, context) => {
    return Promise.all([
        admin.database().ref("/users-public/" + user.uid).set({ "displayName": ""}),
        admin.database().ref('/users-private/' + user.uid).set({ "displayName": "", "email": user.email, "phone": "", "dob": "", "address": "", "age": "", "zip-code": ""})
    ]).then((results)=> {
        console.log("New user: " + user.uid);
    });
});

1 Ответ

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

Ваш код, как показано, не будет работать должным образом, потому что первый возврат предотвратит выполнение второго возврата.

Если у вас есть два элемента асинхронной работы, которые не нужно выполнятьпо порядку, вы должны просто собрать все обещания в массив и использовать Promise.all() в этом массиве.

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

...