gpt4 book ai didi

javascript - 为什么使用 Schedule/onRun 触发器运行相同的 Firebase 函数需要比使用 HTTP onRequest 触发器运行 10 倍的时间?

转载 作者:行者123 更新时间:2023-12-02 20:53:58 25 4
gpt4 key购买 nike

我有 2 个相同的 Firebase 函数,可将数据批量写入 Firestore。一种是包装在预定/onRun 触发器中,另一种是 HTTP onRequest 触发器。

这两个函数都可以正常工作并且不会抛出任何错误。

它们也具有相同的内存量和超时。

调用http触发器时,该函数会运行并在大约30秒内完成。

调用预定的 onRun 触发器时,该函数需要 5 分钟以上才能完成。

运行时是否有未记录的不同内容或其他内容?

编辑:它现在可以工作了 - 我让 processMentions 等待 TotalMentions 并返回 null。

processMentions 不必返回 Promise,只需返回一个值,因为实际的 ScheduledPull/onRun 函数返回 processMentions 异步函数,该函数通过返回一个值来解析 Promise。

为@dougstevenson的帮助干杯

触发器:

/**
* Get manual mentions
*/
exports.get = functions.https.onRequest((req, res) => {
const topic = 'topic'
const query = 'queryString'
processMentions(res, query, topic)
})

/**
* Get schedule mentions
*/
exports.scheduledPull = functions.pubsub.schedule('every day 1:00').onRun((context) => {
const topic = 'topic'
const query = 'queryString'
return processMentions('sched', query, topic)
})

逻辑:

const functions = require('firebase-functions')
const admin = require('firebase-admin')
admin.initializeApp()
const db = admin.firestore()
const axios = require('axios')
const moment = require('moment')

// Globals
const auth = 'token'
const url = 'https://apiurl.com/'

async function totalMentions(nextPage, start, end, query) {
try {
let config = {
headers: {
Authorization: auth,
Accept: 'text/html',
}
}
const response = await axios.get(url, config)
const total = response.data.results.total
const loops = Math.ceil(total / 500)
return loops
} catch (error) {
console.log('error 1', error)
}
}

async function allMentions(nextPage, start, end, query) {
try {
let config = {
headers: {
Authorization: auth,
Accept: 'text/html',
},
}
const response = await axios.get(url, config)
return response
} catch (error) {
console.log('error 2', error)
}
}

async function saveData(response, end, topic) {
try {
let data = await response.data.results.clips
let batch = db.batch()
data.forEach((c) => {
delete c.localTime
let reff = db.collection(collection).doc(date).collection(collection).doc(c.id.toString())
batch.set(reff, c)
})
let batches = await batch.commit()
return batches
} catch (error) {
console.log('error3 ', error)
}
}

async function processMentions(res, query, topic) {
try {
totalMentions(1, start, end, query)
.then(async (loops) => {
let endbatch = 0
for (let i = 1; i <= loops; i++) {
await allMentions(i, start, end, query)
.then(async (response) => {
await saveData(response, end, topic)
return ++endbatch
})
.catch((err) => {
console.log('error 4 ' + err)
})
if (endbatch === loops) {
if (res !== 'sched') {
console.log('http trigger finished')
return res.status(200).end()
} else {
return console.log('schedule finished')
}
}
}
})
.catch((err) => {
console.log('error5 ' + err)
})
} catch (error) {
console.log('error6 ' + error)
}
}

最佳答案

为了使 pubsub 触发器正常工作,processMentions 需要返回一个 promise ,该 promise 会在所有异步工作完成时重新解析。现在,它没有返回任何内容,这(因为它被声明为异步)转化为立即解决的 promise ,没有任何值(value)。对 Promise 调用 then/catch 并没有达到您的预期 - 您需要从异步工作中返回 Promise 链。

我不确定为什么你将其声明为异步,而不在其中使用await来更轻松地管理 promise 。

关于javascript - 为什么使用 Schedule/onRun 触发器运行相同的 Firebase 函数需要比使用 HTTP onRequest 触发器运行 10 倍的时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61535348/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com