如何解决需要帮助使用Google Apps脚本构建Telegram网络应用
我创建了一个Telegram机器人,该机器人具有嵌入式键盘,用户可以通过该键盘输入代码。请参阅下面的GIF 1。当您点击键盘按钮时,消息文本将更新,以便您可以看到输入的所有数字。其背后的网络应用程序是一个Google Apps脚本项目。我在下面附上我的代码。
只要您变慢,一切都将很好地工作,等待文本更新,然后再单击下一步按钮。但是,随着速度的提高,Web应用程序会同时运行多个实例,试图更新相同的消息文本,这会造成严重破坏。请参阅下面的GIF 2。
我想要的目标行为是使消息文本正确更新,无论我点击按钮有多快。我确实需要每个doPost实例在下一个实例运行之前完成。或者,这就是我认为好的计划。
请帮我解决这个问题。
function doPost(e) {
var contents = JSON.parse(e.postData.contents);
var mes_id = contents.callback_query.message.message_id;
var user_input = contents.callback_query.data;
var text_field = contents.callback_query.message.text;
var inline_keyboard = contents.callback_query.message.reply_markup;
UrlFetchApp.fetch(url + "/answerCallbackQuery?callback_query_id=" + String(contents.callback_query.id));
text_field = text_field + ' ' + user_input;
var keydata = {
method: "post",payload: {
method: "editMessageText",chat_id: String(mychat_id),message_id: mes_id,text: text_field,parse_mode: "HTML",reply_markup: JSON.stringify(inline_keyboard)
}
}
UrlFetchApp.fetch('https://api.telegram.org/bot' + token + '/',keydata);
}
解决方法
从您的评论中,我了解到Google Apps脚本中没有异步性(没有异步/等待或承诺)。
此伪代码可能有效,如果当前正在运行,则会将新请求放入队列中-然后在前一个请求完成后对其进行处理(这使我的大脑感到无法进行异步操作)
let processing = false;
let queue = [];
doPost() {
if (!processing) {
// Mark that were running a request (and dont run more at the same time)
processing = true;
[ HERE GOES YOUR CURRENT CODE ]
// Now the request is done,lets see if theres more in the queue
processing = false;
if (queue.lenght > 0) {
doPost(queue.pop()); // Lets process the next request
}
} else {
// Another request is processing,so put this on the queue
queue.push(e);
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。