Облачные функции для firebase — структура функций с несколькими возвращаемыми промисами

Нужно знать, хорошо ли структурирована моя функция и правильно ли она возвращает промисы. Я обрабатываю новые и удаленные данные с помощью основного условного оператора if. Если данные существуют, я выполняю набор базы данных и возвращаю обещание return ProposalsRef.child(recipient).set. Если данных не существует, я возвращаю return ProposalsRef.once('value').... Всякий раз, когда функция запускается, она возвращает только одно обещание (таким образом, она никогда не должна истечь по тайм-ауту). Также я реализую else{return null;} в конце, чтобы избежать тайм-аутов (не уверен, что это хорошая практика)

exports.ObserveJobs = functions.database.ref("/jobs/{jobid}").onWrite((event) => {
    const jobid = event.params.jobid;
    if (event.data.exists() && !event.data.previous.exists()) {
        const recipient = event.data.child("recipient").val();
        if (recipient !== null) {
            let ProposalsRef = admin.database().ref(`proposals/${jobid}`);
            return ProposalsRef.child(recipient).set({
                budget: event.data.child("budget").val(),
                description: event.data.child("description").val(),
                ischat: false,
                isinvitation: true,
                timing: event.data.child("timing").val(),
            });
        };
    } else if (!event.data.exists() && event.data.previous.exists()) {
        let ProposalsRef = admin.database().ref(`proposals/${jobid}`);
        return ProposalsRef.once('value').then(snapshot => {
            if (snapshot.hasChildren()) {
                const updates = {};
                snapshot.forEach(function(child) {
                    updates[child.key] = null;
                });
                return ProposalsRef.update(updates);
            }
        });
    }else{
      return null;
    };
});

Я также хотел бы знать, скажем, мне пришлось бы выполнять несколько операций с базой данных вместо одной. См. пример ниже:

return contractRef.once('value').then(snapshot => {
    let client = snapshot.child("contractor").val();
    let freelancer = snapshot.child("talent").val();
    const clientRef = admin.database().ref(`users/${client}`);
    const freelancerRef = admin.database().ref(`users/${freelancer}`);
    clientRef.child("/account/jobcount").transaction(current => {
        return (current || 0) + 1;
    });
    freelancerRef.child("/account/jobcount").transaction(current => {
        return (current || 0) + 1;
    });
    clientRef.child("/notifications").push({
      timestamp: admin.database.ServerValue.TIMESTAMP,
      key: contractid,
      type: 4
    });
    freelancerRef.child("/notifications").push({
      timestamp: admin.database.ServerValue.TIMESTAMP,
      key: contractid,
      type: 4
    });
});

Я возвращаю только return contractRef... обещаний, следует ли также возвращать обещания в ContractRef (freelancerRef, clientRef)? если да, то должен ли я создать массив промисов, а затем return Promise.all(arrayOfProimises); или я могу вернуть промисы по отдельности return freelancerRef.child("/notifications").push({...


person Diego P    schedule 18.04.2017    source источник


Ответы (1)


Promise.all([...]) создаст одно обещание, которое будет выполнено только тогда, когда будут выполнены все остальные отдельные обещания. Это то, что вы должны вернуть из then (которое затем должно быть возвращено всей функцией), чтобы убедиться, что она ожидает завершения всей работы перед очисткой. Вы не сможете вернуть отдельные промисы по отдельности.

person Doug Stevenson    schedule 19.04.2017