Я сделал эксперимент по этому поводу.
Правда, System.gc();
предлагает только запустить сборщик мусора.
Но вызывая System.gc();
после установки всех ссылок на null
, улучшит производительность и занятость памяти.
function getValues(collectionName, docName) {
return db.collection(collectionName).doc(docName).get().then(function (doc) {
if (doc.exists) return doc.data().text;
return Promise.reject("No such document");
}};
}
Если функция возвращает обещание (например, db.collection(...).doc(...).get()
), верните это обещание. Это «внешний» return
выше.
В обработчике обещаний (внутри обратного вызова .then()
) возвращают значение, указывающее на успех, или отклоненное обещание, указывающее на ошибку. Это «внутренний» return
выше. Вместо возврата отклоненного обещания вы также можете throw
выдать ошибку, если хотите.
Теперь у вас есть функция возврата обещаний. Вы можете использовать его с .then()
и .catch()
:
getValues('configuration','helpMessage')
.then(function (text) { console.log(text); })
.catch(function (err) { console.log("ERROR:" err); });
или await
внутри функции async
в блоке try / catch, если вам это нравится больше:
Если вы хотите использовать async / await с вашей функцией getValues()
, вы можете:
async function getValues(collectionName, docName) {
let doc = await db.collection(collectionName).doc(docName).get();
if (doc.exists) return doc.data().text;
throw new Error("No such document");
}
Поскольку функция getValues
возвращает обещание, вам необходимо await
получить функцию getValues, а вызвать ее .
Измените getValues
следующим образом -
function getValues(collectionName, docName,) {
console.log("start")
var result;
return db.collection(collectionName).doc(docName).get()
.then(function (doc) {
if (doc.exists) {
console.log("Document data:", doc.data());
result = doc.data().text;
console.log(result);
return result;
} else {
// doc.data() will be undefined in this case
console.log("No such document!");
result = "No such document!";
return result;
}
}).catch (function (err) {
console.log('Error getting documents', err);
});
};
Затем используйте getValues
следующим образом -
Объяснение -
async, await
- просто синтаксический сахар для Обещаний. Асинхронные функции возвращают обещание (или AsyncFunction
более точно), которое необходимо разрешить, чтобы использовать его вложенное значение.
См. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function
.Наконец-то удалось заставить его работать. Спасибо за вклад Tomalak!
getValues(help.collectionName, help.docName)
.then((text) => {
console.log(text);
help.message = text;
})
.catch((err) => { console.log("Error: ", err); });
function getValues(collectionName, docName) {
return db.collection(collectionName).doc(docName).get().then((doc) => {
if (doc.exists) {
return doc.data().text;
}
else {
return Promise.reject("No such document");
}});
}
bot.help((ctx) => ctx.reply(help.message));
К сожалению, я не могу точно определить точную причину этого сработало. Некоторые небольшие исправления (пропущенные запятые в console.log) и форматирование определенно помогли мне понять структуру. Надеюсь, кому-то еще это пригодится, когда вы начнете поиграть с узлами и базами огня.