Поскольку функция 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
следующим образом -
[111 ]
Объяснение -
async, await
- просто синтаксический сахар для Обещаний. Асинхронные функции возвращают обещание (или AsyncFunction
более точно), которое необходимо разрешить, чтобы использовать его вложенное значение.
См. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function
.
Похоже, что это использует стандарт C89, который требует, чтобы все переменные были объявлены перед любым кодом. Можно инициализировать их с литералами, и т.д., но не смешать код и переменные.
Должен быть флаг компилятора для включения C99 где-нибудь, который получит Вас поведение, к которому Вы привыкли.
Править: быстрый поиск с помощью Google не выглядит многообещающим для включения C99. Вам, вероятно, придется жить с C89 (который не так плох), или найдите лучший компилятор C (который был бы лучше).
Компилятор Microsoft C является C89 compilant и больше не обновляется, стандартный C99 не является запланированным afaik. Для плоскости C в C99 (переменные не на начинаются блока) используют другой компилятор или расширение C++.
Как другие сказали, это - просто версия C, который поддерживает MSC. Однако, если Вы готовы оскорбить пуристов, можно просто вынудить компилятор скомпилировать как C++.
Это будет иметь очень мало значения к чистому C (существуют некоторые правила о кастинге пусто* указатели и называют изменения художественного оформления), но мог бы дать Вам полезный гибрид. Сгенерированный код будет почти таким же - нет никакой волшебной потери (или усиление) эффективности путем внесения этого изменения.
Вы не говорите, почему Вы стремитесь использовать C.
В C90 все переменные должны быть объявлены перед первым оператором. Дело обстоит не так в C99. Я предполагаю, что Вы видите, имеет ли компилятор переключатель для C99.
Я не знаю для C99, но для более ранних версий локальных переменных языка должен быть объявлен в начале {} блок.
Согласитесь с комментарием о спецификации C. Помните, что C был создан во время, когда компьютеры не имели большой памяти.
Один способ иметь дело с этим состоял в том, чтобы удостовериться, что исходный файл мог быть считан в единственной передаче сверху донизу (который является также причиной, почему .h-файлы используются-> они говорят коду, что определенные функции действительно существуют, но возможно где-нибудь после в первый раз, когда на них ссылаются).
Вероятно, легче создать компилятор для кода, который объявляет переменные во главе объема, чем это для кода, который может объявить переменные где угодно.
Это помогает перевести в блок. Все переменные продвинуты на стек при вводе функции таким образом, Вы не должны волноваться о выполнении его больше нигде.
Стандарт C89, который необходимо использовать на основе этой ошибки, требует, чтобы переменные были объявлены, прежде чем Вы начнете выполнять операторы в любом блоке.
У Вас не будет этой проблемы с .cpp дополнительными файлами, потому что компилятор будет рассматривать их как файлы C++, который не имеет того же ограничения.
Ваш оператор контроля является кодом, таким образом, Вы не можете объявить переменную после этого (в том же блоке/объеме).
Технически Вы могли сделать это:
int foo(int x) {
assert(x != 0);
{
int y = 2 * x;
return y;
}
}
но я не советовал бы ему.
Это - позор, что MS не реализует смешанные объявления и операторы как расширение компилятора C (даже если это прочь по умолчанию и должно быть включено). Я не уверен, но я думаю, что это - довольно общее расширение в других non-C99 компиляторах C; это походит достаточно часто, что я должен согласовать источник и образцы для компиляции в MSVC.
Я думал бы, что будет относительно легко реализовать, так как, конечно, они уже делают это для C++.
Спецификация C требует, чтобы все переменные были объявлены до первой строки исполняемого кода. Компилятор придерживается спецификации. Некоторые компиляторы снисходительны в этом отношении.