Проблема с планировщиком Firebase asyn c - PullRequest
1 голос
/ 01 августа 2020

Я новичок как в firebase, так и в asyn c javascript. Я пытаюсь создать запланированную задачу в firebase, чтобы получить кучу URL-адресов rss из коллекции, проанализировать ее и сохранить в другой коллекции, но я получаю ошибку: 4 DEADLINE_EXCEEDED: крайний срок превышен на Object.callErrorFromStatus после его выполнения.

const refreshRSS = functions.pubsub.schedule('every 30 mins').onRun(async context => {
    let newRSS = addRSS();
    return await newPodcasts;
});

addRSS = async () => {
    const newRSSFeed = new Array();
    let rssURLs = await db.collection('rssURLs').get();
    rssURLs.forEach(async rssURLsObject=>{
        rss = rssURLsObject.data();
        let rssData = await parser.parseURL(rss.url);             
        newRSSFeed.push(db.collection('rss').doc(encodeURIComponent(rss.url))
        .set(podcast));

    })
    return newRSSFeeds;
}

Я также попытался вернуть Promise.all (newRSS) внутри refreshRSS, но он выдает другую ошибку, в которой говорится: не повторяется. Я не уверен, что именно firebase ожидает в качестве возвращаемого параметра.

1 Ответ

0 голосов
/ 01 августа 2020

Когда вам нужно разрешить обещание в l oop, попробуйте использовать карту. Это будет работать:

const refreshRSS = functions.pubsub.schedule('every 30 mins').onRun(async context => {
    let newRSS = await addRSS();
    return await newPodcasts;
});

addRSS = async () => {
    const newRSSFeed = new Array();
    let rssURLs = await db.collection('rssURLs').get();
    let promise = rssURLs.map(async rssURLsObject=>{
        rss = rssURLsObject.data();
        let rssData = await parser.parseURL(rss.url);  
        let con = await db.collection('rss').doc(encodeURIComponent(rss.url)
        newRSSFeed.push(con)
        .set(podcast));

    })
    await Promise.all(promise)
    return newRSSFeeds;
}
...