У меня есть работающая рекурсивная функция в приложении node.js, которое использует Promises с обратным вызовом process.nextTick(). Мне любопытно, как это будет/может работать с асинхронным ожиданием.
Я пробовал несколько разных вещей, но независимо от того, что я сделал, асинхронная функция возвращается к вызывающей функции до завершения всех обратных вызовов nextTick.
не работает (удалить кеш, вызванный из экспресс-маршрута)
const deleteCache = async () => {
try {
const cacheRef = fsDb.collection('Cache');
return await deleteDocsBatch(cacheRef, 30);
} catch (e) {
console.error('error in deleteCache:' + e);
}
};
const deleteDocsBatch = async (cacheRef, batchSize) => {
try {
// get all the cached docs, limit to 30 to avoid potential memory issues
const snapShot = await cacheRef.limit(batchSize).get();
if (snapShot.size === 0) { return; }
const batch = fsDb.batch();
snapShot.docs.forEach((doc) => {
batch.delete(doc.ref);
});
await batch.commit();
process.nextTick(() => {
deleteDocsBatch(cacheRef, batchSize);
});
} catch (e) {
console.error('error in deleteDocsBatch:' + e);
}
};
работающий:
function deleteCollection (batchSize) {
var collectionRef = fsDb.collection('Cache');
var query = collectionRef.orderBy('__name__').limit(batchSize);
return new Promise((resolve, reject) => {
deleteQueryBatch(fsDb, query, batchSize, resolve, reject);
});
}
function deleteQueryBatch (db, query, batchSize, resolve, reject) {
query.get()
.then((snapshot) => {
// When there are no documents left, we are done
if (snapshot.size === 0) {
return new Promise((resolve, reject) => { resolve(0); });
}
// Delete documents in a batch
var batch = db.batch();
snapshot.docs.forEach((doc) => {
batch.delete(doc.ref);
});
return new Promise((resolve, reject) => {
batch.commit().then(() => {
resolve(snapshot.size);
})
.catch(reject);
});
}).then((numDeleted) => {
if (numDeleted === 0) {
resolve();
return;
}
// Recurse on the next process tick, to avoid
// exploding the stack.
process.nextTick(() => {
deleteQueryBatch(db, query, batchSize, resolve, reject);
});
})
.catch(reject);
}
Можно ли написать эту рекурсивную функцию с помощью nexttick(), используя асинхронное ожидание?
исходный образец кода firestore:
https://firebase.google.com/docs/firestore/manage-data/delete-data