Я пишу бота Telegram с использованием инфраструктуры Telegraf в Nodejs и хотел бы отобразить баннер «bot is typing ...», пока бот выполняет сетевой вызов.
Проблема, с которой я столкнулся, заключается в том, что моя функция не выполняется так, как она должна быть, ie баннер «печатать» появляется и исчезает через 5 секунд (согласно документам), но Счет никогда не отправляется, по крайней мере, через 30 секунд. Оценка журналов также показывает, что журналы консоли были выполнены после завершения функции.
Вот моя реализация:
module.exports = (bot) => bot.command('buy', (ctx) => {
let catalogueId = //some regex
return Promise.all([
ctx.replyWithChatAction('typing'),
sendInvoice(catalogueId, ctx)
])
})
function sendInvoice(catalogueId, ctx) {
console.log('1')
return helper.getItem(catalogueId)
.then((item) => {
console.log('2')
return createInvoice(item, ctx)
.then((invoice) => {
console.log('3')
return ctx.replyWithInvoice(invoice)
})
})
}
Операторы журнала, как видно в моих облачных функциях Firebase, выглядят так:
Как Вы можете видеть, что журналы консоли печатаются после завершения функции и находятся на расстоянии почти 15 секунд. Другие попытки:
//Attempt 2, same result as above
module.exports = (bot) => bot.command('buy', (ctx) => {
let catalogueId = //some regex
return ctx.replyWithChatAction('typing')
.then(() => sendInvoice(catalogueId, ctx))
})
//Attempt 3, log statements are printed before function ends, but the 'typing' only shows at the end. Need it to show when the networking calls starts
module.exports = (bot) => bot.command('buy', (ctx) => {
let catalogueId = //some regex
return sendInvoice(catalogueId, ctx))
})
function sendInvoice(catalogueId, ctx) {
console.log('1')
return helper.getItem(catalogueId)
.then((item) => {
console.log('2')
return createInvoice(item, ctx)
.then((invoice) => {
console.log('3')
return ctx.replyWithChatAction('typing')
.then(() => ctx.replyWithInvoice(invoice))
})
})
}
Мой бот в настоящее время развернут в облачной функции Firebase.