как прочитать ответ с длительным ожиданием от веб-сервиса (> 5 секунд) с последующими событиями Dialogflow?

# #axios #timeout #dialogflow-es #dialogflow-es-fulfillment

Вопрос:

Как управлять вызовом WS, превышающим тайм-аут диалогового потока (5 секунд)

Всем привет, я пытаюсь создать агент dialogflow, который позволяет возвращать список заказов, сделанных каким-либо пользователем. Для этого боту необходимо получить информацию из удаленной удаленной базы данных. Проблема в том, что иногда этот процесс длится менее 5 секунд, а иногда и больше. Поэтому я пытаюсь использовать «Последующее событие», чтобы продлить этот тайм-аут до 10 или 15 секунд. Идея состоит в том, чтобы выполнить асинхронный вызов веб-сервиса, сохранить ответ в контексте «мои данные», а затем отобразить этот список пользователю (эта последняя часть на данный момент не реализована). Это код, который я использую :

 function sleepFor(millis){
    var now = new Date().getTime();
    while(new Date().getTime() < now   millis){ /* Do nothing */ }
}


function call(agent) {
    const httpClient = require('axios').create({
        baseURL: 'SERVERURL'
    });


    return httpClient
        .get("/orders/MY_USER?language=xd")
        .then(result => {


            return result.data;
        })
        .then(result => {
            agent.setContext({
                "name": "my-data",
                "lifespan": 5,
                "parameters": {"name": "orders", "entities": result}
            });
           /* agent.setFollowupEvent("WAIT_FINISHED", {
                "name": "my-data",
                "parameters": {"name": "orders", "entities": result}
            });*/



            console.log('CALL END : found some data : '   JSON.stringify(result));



            agent.add("This is a waitStart Success response");
            return Promise.resolve("Call is complete !");
        })
        .catch((error) => {
            // handle error
            console.log('CALL FAILED : Querying orders failed : '   error);
            return Promise.resolve("Call failed...");
        });
}



function waitStart(agent) {
    console.log("WAIT START : Waiting task starts...");


    return Promise.race([call(agent), sleep(3500)])
        .catch((error) => {
            // handle error
            console.log('Race failed : '   error);
            return Promise.resolve("WaitStart is complete !");
        });
}



function waitMore(agent) {
    sleepFor(3500);



    const data = agent.contexts.find(x => x.name === 'my-data');
    console.log("WAIT_MORE : my-data exists ? "   JSON.stringify(data));



    agent.add("This is a waitMore Success response");
}



function sleep(millis) {
    return new Promise(resolve => setTimeout(resolve(" "), millis))
        .then(result => {
            agent.add("The transaction continues...");
            agent.setFollowupEvent("WaitMore");
            return Promise.resolve("WaitMore is complete !");
        });
}



let intentMap = new Map();
intentMap.set('List my orders', waitStart);
intentMap.set('waitMore', waitMore);
 

Но, к сожалению, это не работает. У меня в консоли есть это сообщение : «Это ответ на ожидание большего успеха», но в моем контексте «мои данные» ничего нет, НО я вижу в своих журналах «КОНЕЦ ВЫЗОВА : найдены некоторые данные : [{«идентификатор»:»A001″,»имя»:»ЗАКАЗ000001″,»статус»:»отправлено…».

Большое спасибо !