gpt4 book ai didi

javascript - 是否可以等待WizardScene?

转载 作者:搜寻专家 更新时间:2023-10-31 23:25:59 25 4
gpt4 key购买 nike

我用TelegrafJS开发了一个电报机器人,还用TelegrafInlineMenu库处理菜单布局。
我注册了用于验证用户输入的WizardScene,代码如下:

const WizardScene = require('telegraf/scenes/wizard');
const Stage = require('telegraf/stage');
const projectController = require('../controllers/project.controller');

module.exports = function(bot) {

const projectNameWizard = new WizardScene('projectName-wizard',
(ctx) => {

ctx.reply(ctx.i18n.t('projectName'));
ctx.scene.session.project = {};

//Project updating
ctx.scene.session.project.oldName = ctx.match[1];

//Keep customer reference
ctx.scene.session.project.customerId = ctx.update.callback_query.from.id;
return ctx.wizard.next();
},
async(ctx) => {

//Get the name of the projec
let oldPrName = ctx.scene.session.project.oldName;
let newPrName = ctx.message.text;

//Convalidate project
if (ctx.message.text.length < 1 || ctx.message.text.length > 12) {
return ctx.reply(ctx.i18n.t('invalidProjectName', {
"characters": 12
}));
}
ctx.scene.session.project.name = ctx.message.text;

//Update the project fields
await projectController.SaveProject(ctx.scene.session.project, ctx.update.message.from);
let pr = await projectController.DisplayProjectDetails(ctx, newPrName);

ctx.scene.leave();

//Project was updated
if (oldPrName !== undefined) {

ctx.reply(ctx.i18n.t('projectUpdated'));
}

return pr;
}
);

const stage = new Stage([projectNameWizard]);
stage.command('cancel', (ctx) => {

ctx.reply(ctx.i18n.t('operationCanc'));
return ctx.scene.leave();
});
bot.use(stage.middleware())
}

要在菜单中启动向导,我使用以下代码:
projectEdit.simpleButton(ctx =>
ctx.i18n.t('editName'), 'EDIT_PR_NAME', {
doFunc: async ctx => {
await ctx.scene.enter('projectName-wizard');
console.log("hello world");
},
});

我需要等待向导场景的完成,然后执行 console.log;问题是 await前面的 ctx.scene.enter没有等待任何东西,并且 hello world消息会立即打印出来。有什么能让我等待巫师的结果吗?如果没有,我该如何处理这种情况?
亲切的问候

最佳答案

“我需要等待wizardscene完成,然后执行console.log,问题是ctx.scene.enter前面的wait没有等待任何东西,hello world消息会立即打印出来。
有什么东西能让我等待巫师的结果吗?
如果没有,我还能怎么处理这种情况呢?”
我不使用telegraf,但是如果每次尝试都失败了,那么可以考虑在wizardscene准备好时使用自定义事件来通知。它可能会帮助你解决“hello world is printed immediate…”的问题。
而不是await或场景准备就绪,而是监听准备就绪的通知(事件)。转到代码中使场景“准备就绪”的部分,然后从那里分派事件以通知代码处理完成。
自定义事件的基本示例:

<!DOCTYPE html>
<html>
<body>

<script>

//# define Event
var myReadyEvent = new CustomEvent("evt_WizardIsReady");

//# create Event handling function
function doWizardIsReady(evt)
{
alert("Got Event... : " + evt.type);
console.log("hello world");
}

//# some function to trigger Event
function doSomething()
{
//# eg: prepare your scene here

//# and then dispatch at end of setup (before any RETURNs)
document.body.dispatchEvent( myReadyEvent );
}

document.body.addEventListener("evt_WizardIsReady", doWizardIsReady, false);
setTimeout(doSomething, 6000); //represents waiting time for WIzardScene to be ready...

</script>

</body>
</html>

看看你的代码…
你想做的: document.body.dispatchEvent( myReadyEvent );
行前 return pr;
或在线路后尝试 bot.use(stage.middleware())
或者,考虑编辑telegraf源代码:
context.js-在第43行编辑 enter函数。
尝试在线路 return handler(this.ctx, noop)之前调度事件。
document.body.dispatchEvent( myReadyEvent );
return handler(this.ctx, noop)

然后在主html代码(加载所有这些外部js文件)中,您可以接收这样的调度事件:
<body>

<script type="text/javascript" src="context.js"></script>

<script>

//# define Event
var myReadyEvent = new CustomEvent("evt_WizardIsReady");
document.body.addEventListener("evt_WizardIsReady", doWizardIsReady, false);

//# create Event handling function
function doWizardIsReady(evt)
{
alert("Got Event... : " + evt.type);
console.log("hello world");
}

</script>

</body>

另请参见: stage.js-检查第37行的 enter功能。这个值得用自定义事件编辑吗?

关于javascript - 是否可以等待WizardScene?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56518459/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com