You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何正确关闭/停止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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 03:42:31