# #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″,»статус»:»отправлено…».
Большое спасибо !