如何等待directLine.activity$完成后再发送Twilio响应?
问题描述
我使用以下代码监听机器人发送的activity:
/* Listen to activities sent from the bot */ directline.activity$ .filter(activity => activity.type === 'message' && activity.from.id === botId) .subscribe(message => { if (message) { console.log("Reply", message) twiml.message(message); } });
这段代码可正常运行,但我的响应发送逻辑会在监听器处理完成前就执行:
context.res = { headers: { 'Content-Type': 'application/xml' }, body: twiml.toString() };
其中twiml.message用于生成符合Twilio要求的响应格式。我尝试过let x = await directline.activity$但无效,还编写了异步函数step2并通过then链式调用,仍无法等待监听器完成再发送响应。请问如何让代码等待监听器处理完成后再执行后续步骤?
解决方案
由于directline.activity$是RxJS的Observable对象,直接await或简单链式调用无法正确等待单次消息处理完成。你可以将Observable转换为Promise,只等待第一条符合条件的消息:
// 将Observable转为Promise,获取第一条符合条件的消息 const botMessage = await directline.activity$ .filter(activity => activity.type === 'message' && activity.from.id === botId) .pipe(first()) // 仅获取第一条符合条件的消息,确保Observable自动完成 .toPromise(); // 转换为Promise以支持await if (botMessage) { console.log("Reply", botMessage); twiml.message(botMessage); } // 此时twiml已完成处理,执行响应发送逻辑 context.res = { headers: { 'Content-Type': 'application/xml' }, body: twiml.toString() };
关键说明
first()操作符:确保只取第一条符合条件的消息,Observable会在获取到消息后自动完成,避免持续监听。toPromise():将Observable转换为Promise,让你可以用await等待消息到来并完成处理。
如果你的RxJS版本为v7及以上,toPromise()已被弃用,建议改用firstValueFrom:
import { firstValueFrom } from 'rxjs'; // ... const botMessage = await firstValueFrom( directline.activity$ .filter(activity => activity.type === 'message' && activity.from.id === botId) .pipe(first()) );
内容的提问来源于stack exchange,提问作者Steven
相关产品推荐
相关产品推荐

