Получить асинхронное значение из пожарного магазина

Я сделал эксперимент по этому поводу.

Правда, System.gc(); предлагает только запустить сборщик мусора.

Но вызывая System.gc(); после установки всех ссылок на null, улучшит производительность и занятость памяти.

0
задан Hongarc 19 March 2019 в 10:53
поделиться

3 ответа

1114 У вас все не так. Это намного проще, чем вы думаете.

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, если вам это нравится больше:

[ 112]

Если вы хотите использовать 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");
}
0
ответ дан Tomalak 19 March 2019 в 10:53
поделиться

Поскольку функция 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

.
0
ответ дан Yasser Hussain 19 March 2019 в 10:53
поделиться

Наконец-то удалось заставить его работать. Спасибо за вклад 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) и форматирование определенно помогли мне понять структуру. Надеюсь, кому-то еще это пригодится, когда вы начнете поиграть с узлами и базами огня.

0
ответ дан RobSteward 19 March 2019 в 10:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: