Это потому, что метод get()
является асинхронным и возвращает Обещание: console.log()
s в методе then()
выполняются только в том случае, если Обещание, возвращенное методом get()
, выполнено, С другой стороны, строка, которая печатает END
, выполняется немедленно и, следовательно, будет «всегда» предшествовать console.log()
s в then()
.
. Кроме того, обратите внимание, что вы неправильно возвращаете Цепочка обещаний . Я бы посоветовал вам посмотреть 3 видео о "JavaScript Promises" из серии Firebase . Это КЛЮЧЕВОЙ пункт для облачных функций .
Поэтому вы должны сделать следующее:
exports.notifysmall = functions.pubsub.schedule('0 15 * * *')
.timeZone('Europe/Berlin').onRun((context) => {
const db = admin.firestore();
console.log("#################START RUN################");
return db.collection("user").get() // <--- See the return
.then((snapshot: any) => {
snapshot.forEach((record: any) => {
console.log(record.get("name"));
});
console.log("#################END 1 ################");
return true;
}).catch((err: any) => {
console.log("#################ERROR################");
return true;
});
console.log("#################END 2 ################");
});
То, что вы должны увидеть с помощью приведенного выше кода, выглядит следующим образом: следует:
#################START RUN################
#################END 2 ################
user1
user2
user3
#################END 1 ################
Строка, которая печатает END 1
, будет выполнена после других console.log()
с, как объяснено выше.