Nodejs Telegram Bot: sendChatAction при ожидании сетевого вызова - PullRequest
0 голосов
/ 21 марта 2020

Я пишу бота 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, выглядят так: enter image description here

Как Вы можете видеть, что журналы консоли печатаются после завершения функции и находятся на расстоянии почти 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.

...