Я хочу, чтобы мой бот Dialogflow сказал сообщение, содержащее результат запроса MongoDB

В документе проекта lambda: Состояние лямбда v4

В разделе 7. Захват переменной. Упоминается, что ....

Мы намерены запретить захват изменяемых локальных переменных. Причина в том, что подобные идиомы:

int sum = 0;
list.forEach(e -> { sum += e.size(); });

являются принципиально серийными; довольно сложно писать лямбда-тела, подобные этому, которые не имеют условий гонки. Если мы не хотим принуждать - желательно во время компиляции - чтобы такая функция не могла выйти из своей захватывающей нити, эта функция может вызвать больше проблем, чем она решает.

Изменить:

Еще одна вещь, которую следует отметить здесь: локальные переменные передаются в конструкторе внутреннего класса при доступе к ним внутри вашего внутреннего класса, и это не будет работать с не окончательной переменной, так как значение не конечных переменных может быть изменено после построения .

В то время как в случае переменной экземпляра компилятор передает ссылку класса и класса, ссылка будет использоваться для доступа к переменной экземпляра. Таким образом, это не требуется в случае переменных экземпляра.

PS: Следует отметить, что анонимные классы могут получить доступ только к конечным локальным переменным (в JAVA SE 7), тогда как в Java SE 8 вы можете эффективно конечные переменные также внутри лямбда, а также внутренние классы.

1
задан Prisoner 16 January 2019 в 17:54
поделиться

1 ответ

Проблема в том, что обработчик намерений ожидает, что вы вернете Обещание, если вы выполняете какие-либо асинхронные функции - например, доступ к базе данных. Самый простой способ сделать это - перейти от использования обратных вызовов с MongoDB к использованию версий функций, возвращающих Promises, а затем вернуть обещание.

Я не проверял, но что-то вроде этого может сработать

return MongoClient.connect( uri )
  .then( client => {
    const collection = client.db("test").collection("data");
    return collection.find({fname: 'Example'}).toArray();
  })
  .then( result => {
    let name = result[0].lname;
    agent.add("Found last name: "+name);
  });
0
ответ дан Prisoner 16 January 2019 в 17:54
поделиться
Другие вопросы по тегам:

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