В отношении этого ответа большое количество обещаний о том, как обрабатывать большое количество запросов. Я перегруппировал запросы, как показано, используя библиотеку 'lodash', которая работает для небольшого числа запросов, однако в Firebaseвозвращает ошибку
@ firebase / database: FIREBASE WARNING: Исключение было вызвано обратным вызовом пользователя.RangeError: Превышен максимальный размер стека вызовов
Что я знаю, это означает, что массивы слишком велики, однако, когда я пытаюсь запустить чистые обещания Javascript с таймером 10 мс, код, кажется, содержит до 1 000 000 какпоказано в этом ответе.Я не уверен, является ли это проблемой firebase или node.js, но, учитывая, что база данных firebase в реальном времени может хранить миллионы записей в дереве JSON, должен быть лучший способ обработки такого количества обещаний.Я в значительной степени основывал подход на основе этих трех вопросов, это была первоначальная проблема Найти узлы элементов, содержащиеся в другом узле , этот подход для проверки базы данных, который требует так много операций чтения , проверяет, существуют ли данные вfirebase , и этот подход для ускорения запросов Ускоряет выборку сообщений для моего приложения в социальной сети, используя запрос вместо неоднократного наблюдения одного события
Я не уверен, что яЯ выполняю все эти чтения правильно, особенно потому, что это такой большой объем, спасибо.
exports.postMadeByFriend = functions.https.onCall(async (data,context) => {
const mainUserID = "hJwyTHpoxuMmcJvyR6ULbiVkqzH3";
const follwerID = "Rr3ePJc41CTytOB18puGl4LRN1R2"
const otherUserID = "q2f7RFwZFoMRjsvxx8k5ryNY3Pk2"
var promises = [];
console.log("start")
var refs = [];
for(var x = 0; x < 100000; x +=1){
if (x === 999){
const ref = admin.database().ref(`Followers`).child(mainUserID).child(follwerID)
refs.push(ref);
continue;
}
const ref = admin.database().ref(`Followers`).child(mainUserID).child(otherUserID);
refs.push(ref);
}
function runQuery(ref){
return ref.once('value');
}
const batches = _.chunk(refs, 10000);
refs = [];
const results = [];
while (batches.length) {
const batch = batches.shift();
const result = await Promise.all(batch.map(runQuery));
results.push(result)
}
_.flatten(results);
console.log("results: " + JSON.stringify(results));
})