当前位置: 首页 > 知识库问答 >
问题:

来自后台活动的慢速firebase功能响应

呼延智明
2023-03-14

下面显示的功能令我困惑,原因有二:

  • 函数执行在给出所有输出之前终止

在搜索最佳实践时,我发现了一个提示,即在函数执行终止后,背景活动会减慢(https://cloud.google.com/functions/docs/bestpractices/tips#do_not_start_background_activities)。

如何创建一个函数,该函数在创建所有输出后终止并避免后台活动
有没有办法加快get()处理的速度?

firebase功能仪表板屏幕截图

firestore的屏幕快照,显示为触发函数而创建的文档

请看看代码:

// The Cloud Functions for Firebase SDK to create Cloud Functions .
const functions = require("firebase-functions");
// The Firebase Admin SDK to access Firestore.
const admin = require("firebase-admin");
admin.initializeApp();

const db = admin.firestore();

exports.evaluateScore = functions
.region('europe-west1')
.firestore   
  .document('organizations/{orgId}/persons/{personId}')  
  .onWrite(async (snap, context) => {

const newDocument = snap.after.exists ? snap.after.data() : null; 
const oldDocument = snap.before.exists ? snap.before.data() : null;    
console.log(`lastName: '${newDocument.personLastName}'; id: '${snap.after.id}'`);


// if only newDocument exists
if (newDocument != null && oldDocument == null ) {
  
  const arrayNameSplit = snap.after.ref.path.split('/'); 
  var orgId = arrayNameSplit[arrayNameSplit.length -3];    

  
  var listOfProfiles = newDocument.listOfProfiles;
  console.log(`listOfProfiles: `, JSON.stringify(listOfProfiles));
      
  for (let i = 0; i < listOfProfiles.length; i++) {
    db.collection('organizations').doc(orgId).collection('profiles').doc(listOfProfiles[i]).get()
    .then(docRef => {
      const profile = docRef.data();
      console.log(i, ' profileTitle:', JSON.stringify(profile.profileTitle))
    }).catch(e => {
      console.error('something went wrong', e)
    });
  }    
}
  });

共有1个答案

司徒捷
2023-03-14

您的代码中有异步调用,但没有告诉云函数运行时(通过返回值)。很有可能您的数据库get()调用在这个阶段甚至没有完成。

要解决这个问题,您可以在循环中使用waitPromise.all

exports.evaluateScore = functions
.region('europe-west1')
.firestore   
  .document('organizations/{orgId}/persons/{personId}')  
  .onWrite(async (snap, context) => {

const newDocument = snap.after.exists ? snap.after.data() : null; 
const oldDocument = snap.before.exists ? snap.before.data() : null;    
console.log(`lastName: '${newDocument.personLastName}'; id: '${snap.after.id}'`);


// if only newDocument exists
if (newDocument != null && oldDocument == null ) {
  
  const arrayNameSplit = snap.after.ref.path.split('/'); 
  var orgId = arrayNameSplit[arrayNameSplit.length -3];    

  
  var listOfProfiles = newDocument.listOfProfiles;
  console.log(`listOfProfiles: `, JSON.stringify(listOfProfiles));
      
  for (let i = 0; i < listOfProfiles.length; i++) {
    const docRef = await db.collection('organizations').doc(orgId).collection('profiles').doc(listOfProfiles[i]).get();

    const profile = docRef.data();
    console.log(i, ' profileTitle:', JSON.stringify(profile.profileTitle))
  }    
}
});

你的代码可能会有更多的问题,所以我建议阅读同步、异步和promise的留档,以及如何为未来的问题创建一个最小、完整、可验证的示例。

 类似资料:
  • 我已将自动完成功能应用于两个。为此,我使用了自动完成计算器。我观察到它的速度减慢到我甚至无法输入一个字符的程度。有什么解决办法吗? 谢谢

  • 问题内容: 我们正在开发使用新的Firebase云功能的应用程序。当前正在发生的事情是将事务放入队列节点中。然后函数删除该节点并将其放入正确的节点。由于能够脱机工作,因此已经实现了该功能。 我们当前的问题是功能的速度。该函数本身大约需要400毫秒,所以没关系。但是有时该功能需要很长时间(大约8秒),而该条目已被添加到队列中。 我们怀疑服务器需要花费一些时间来启动,因为在第一个操作之后我们再次执行该

  • 设置:我有一个Google工作表,我想在其中运行一个使用脚本实现的自定义函数。此脚本用于执行相对较长的URL查找和解码过程(每次调用10毫秒,取决于带宽和ping)。自定义函数使用一列作为输入,并返回结果。 问题:当我的Google工作表打开时,使用此计算的列将刷新。这会使Google工作表停止大约10秒钟,直到重新计算列中的每个单元格。这只会变得更糟,因为我添加到我的电子表格。 问题:我可以更改

  • 问题内容: 我有一个Python脚本,有时会向用户显示图像。图像有时可能很大,并且经常重复使用。显示它们不是关键,但显示与它们关联的消息是至关重要的。我有一个功能,可以下载所需的图像并将其保存在本地。现在,它与向用户显示消息的代码内联运行,但是对于非本地图像,有时可能会花费10秒钟以上。有没有一种方法可以在需要时调用此函数,但是在代码继续执行的同时在后台运行?我只会使用默认图像,直到正确的图像可用

  • 在我的应用程序中,当我从后台回来时,我的活动会自动接近,并且它总是显示以前的活动。示例:我用活动A启动应用程序 }

  • 问题内容: 我正在尝试实现自动补全功能,但是找不到在Swift中可用的示例。下面,我打算转换Ray Wenderlich的自动完成教程 和2010年的示例代码。最后,代码进行了编译,但是没有显示包含可能完成的表格,而且我没有经验来了解为什么它未被隐藏shouldChangeCharactersInRange。 问题答案: 用下面的内容替换您的函数内容。希望对您有帮助。