需要知道我的功能是否结构良好,并且返回的承诺正确。我正在处理新的和已删除的数据,并具有主要条件的IF语句。如果存在数据,我正在执行数据库集并返回Promise 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;
};
});
我也想知道,假设我必须执行多个数据库操作而不是执行一个数据库操作。请参见示例Bellow:
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...
承诺,也应该返回Ontractref中的承诺(FreelancerRef,ClientRef(吗?如果是这样,我应该创建一系列承诺,然后是return Promise.all(arrayOfProimises);
,否则我可以单独返回承诺return freelancerRef.child("/notifications").push({...
Promise.all([...])
才会创建一个只有在满足所有其他个人承诺的情况下才能实现的单一承诺。这是您应该从then
返回的内容(然后应该由整个功能返回(,以确保它在清理之前等待所有工作要完成。您将无法单独退还个人承诺。