Вы не можете запустить выполнение асинхронно.В диалоговой модели ожидается, что выполнение будет выполнять некоторую логику, которая определяет ответ.
Вы можете , однако выполнить асинхронную операцию в выполнении, которая не завершается перед вамивернуть результат.
Если вы используете достаточно современную версию узла (версия 8 и выше), вы можете сделать это, объявив функцию как async
функцию, но не вызывая его с ключевым словом await
.(Если вы вызовете его с помощью await
, он будет ждать завершения асинхронной операции, прежде чем продолжить.)
Итак, что-то вроде этого должно работать, учитывая ваш пример:
async function doSomethingLong(){
// This takes 20 seconds
}
fdk.handle(function (input) {
doSomethingLong();
return {'fulfillmentText': 'This might respond before doSomethingLong finishes.'}
});
Обновление 1 на основе вашего примера кода.
Кажется странным, что вы сообщаете, что вызов request
вообще не выполняется, но есть некоторые странные вещиэто может быть причиной.
Во-первых, request
само по себе не является асинхронной функцией.Он использует модель обратного вызова, и функции async
не просто автоматически ожидают вызова этих обратных вызовов.Таким образом, ваша callFlow()
функция вызывает console.log()
пару раз, вызывает request()
и возвращается до обратного вызова.
Вы, вероятно, должны заменить request
чем-то вроде request-обещание пакет и ждите обещание, которое вы получите от звонка.Это делает callFlow()
действительно асинхронным (и вы можете регистрировать, когда он завершает вызов).
Во-вторых, я хотел бы отметить, что код, который вы показали, не выполняет операцию POST.Это делает GET по умолчанию.Если вы или API, который вы вызываете, ожидаете POST, это может быть источником ошибки.Однако я ожидал, что параметр err
будет заполнен, и ваш код выглядит так, как будто он проверяет и регистрирует это.
Единственный неизвестный во всей настройке, для меня, это то, что яЯ не знаю, как fdk
обрабатывает асинхронные функции, и мое беглое чтение документации не научило меня.Я сделал это с другими фреймворками, и это не проблема, но я не знаю, истекает ли время обработки обработчика fdk
или выполняет другие действия, чтобы завершить вызов после отправки ответа.