如何正确关闭/停止FaunaDB stream?调用close()无效怎么办
FaunaDB流关闭问题解答
FaunaDB Stream实例没有stop()方法,官方指定的流终止接口就是close(),你调用后不生效是代码本身的问题,和接口无关。
现有代码的问题点
- 语法错误:
stopStream函数末尾多写了一个多余的右大括号,会导致函数解析、执行异常 - 变量未声明:代码里用到的
timeout、room_name变量没有在作用域顶部提前声明,会触发隐式全局变量甚至报错,导致终止逻辑走不通 - 重连逻辑冲突:流报错时写了1秒后自动重启的逻辑,但是没有保存这个定时器的ID,调用
close()的时候如果已经触发了重连调度,没有清掉定时器的话,流会被自动重新拉起,看起来就像close没起作用 - 缺少实例判空:如果stream还没初始化就调用stopStream,会直接触发JS报错中断后续逻辑
修正后的完整代码
var stream var query var room_name = '' var timeout = false var reconnectTimer = null // 存储重连定时器ID let collection_name = 'rooms'; var document_reference; var client; export function connectToFauna() { connectToFauna = () => {}; // 保证connectToFauna只调用一次 client = new window.faunadb.Client({ secret: process.env.<SECRET>, domain: 'db.fauna.com', }); }; export function setupStream(room_name_param) { console.log({room_name: room_name_param}) room_name = room_name_param timeout = false query = window.faunadb.query; document_reference = query.Ref(query.Collection(collection_name), room_name); startStream(client, document_reference); } export function stopStream() { // 先清掉未执行的重连任务 if (reconnectTimer) { clearTimeout(reconnectTimer) reconnectTimer = null } // 流实例存在才调用close if (stream) { stream.close() stream = null } room_name = '' timeout = true console.log('stream stopped') } const startStream = (client, document) => { stream = client.stream.document(document) .on('snapshot', snapshot => { report('snapshot', snapshot); }) .on('version', version => { report('version', version); }) .on('error', error => { console.log('Error:', error); if (stream) { stream.close() } if (!timeout) { console.log('restart') // 保存定时器ID,方便停止时清理 reconnectTimer = setTimeout(() => { startStream(client, document) }, 1000); } }) .start() }; function report(action, event) { var data = ('action' in event) ? event["document"].data : event.data; room_data.set(data); };
补充说明
- 正确调用
close()之后流会正常终止,不会再接收新的事件推送 - 实现用户无操作自动停流逻辑时,只要在用户触发操作的时候重置空闲计时器,计时到点直接调用修正后的
stopStream即可,不会出现流无法关闭的情况
内容的提问来源于stack exchange,提问作者Psionman
相关产品推荐
相关产品推荐

