如何在Sapper的svelte组件中运行服务器发送的事件

伊莱奥特

我有一个名为[symbol] .svelte的苗条组件,我想在其中启动与流服务的连接以接收服务器发送的事件。我尚未找到成功完成此操作的方法。

由于EventSource仅在浏览器中运行,因此我在onMount函数中对其进行了初始化,如下所示:

<script>
    export let quote;

    let sse = {};

    onMount(async () => {
        sse = new EventSource(`https://myurl.com?symbol=${quote.symbol}`);
        sse.onmessage = (event) => {
            let response = JSON.parse(event.data);
            if(!response.length) return;
            quote = response[0];
        }
    });

    onDestroy(() => {
        if(sse.readyState && sse.readyState === 1) {
            sse.close();
        }
    })  
</script>

<div>{quote.symbol}</div>

除非我导航到使用相同组件的另一条路线,否则此方法工作正常-因为该组件不会卸载和重新安装,onMount()不会触发,因此不会实例化新的SSE请求。我不知道有什么方法可以轻松地强制重新安装组件,这将是最简单的(相关的github问题在这里

另一种尝试是使用反应式语句,如下所示:

<script>
    export let quote;

    let sse = {};

    $: {
        if(process.browser === true) { //again, this stuff won't run on the server
            if(sse.readyState && sse.readyState === 1) {
                sse.close();
            }
            sse = new EventSource(`https://myurl.com?symbol=${quote.symbol}`);
        }
    }

    sse.onmessage = (event) => {
        let response = JSON.parse(event.data);
        quote = response[0];
        console.log(quote);
    }
</script>

<div>{quote.symbol}</div>

更改路线时,quote变量也会更改,从而触发反应式语句终止现有的SSE并实例化一个新的SSE。除了onmessage处理程序不会触发之外,可能是因为onmessage处理程序在创建eventsource对象之前已附加。

最后要做的是尝试在反应式语句中使用onmessage处理程序,如下所示:

<script>
    export let quote;

    let sse = {};

    $: {
        if(process.browser === true) { //again, this stuff won't run on the server
            if(sse.readyState && sse.readyState === 1) {
                sse.close();
            }
            sse = new EventSource(`https://myurl.com?symbol=${quote.symbol}`);
            sse.onmessage = (event) => {
                let response = JSON.parse(event.data);
                quote = response[0];
                console.log(quote);
            }           
        }
    }
</script>

<div>{quote.symbol}</div>

这里的问题是,由于quote被重新分配为onmessage处理程序的产品,因此反应式语句会不断循环触发。

在这一点上我很茫然,任何输入将不胜感激!

里奇·哈里斯

听起来好像您想使用{#key ...},这会导致其值更改时其内容被拆除并重新创建,包括以下组件:

{#key quote}
  <!-- destroyed and recreated whenever `quote` changes -->
  <Quote {quote}/>
{/key}

此处的文档:https : //svelte.dev/docs#key

顺便说一句,onDestroy如果仅用于清理发生在onMount以下内容中的工作,则不需要使用

onMount(() => {
  const sse = new EventSource(`https://myurl.com?symbol=${quote.symbol}`);
  sse.onmessage = (event) => {
    let response = JSON.parse(event.data);
    if(!response.length) return;
      quote = response[0];
    }
  };

  return () => {
    if(sse.readyState === 1) {
      sse.close();
    }
  });
});  

这样做会更好,因为您没有顶级sse变量,并且由于返回的清除功能仅需要在浏览器中使用,因此不需要进行占位符ssr = {}分配或检查sse.readyState

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在Svelte / Sapper中动态导入和渲染组件?

如何在服务器端React中访问JSX组件的DOM事件处理程序

如何在 Flask 框架中实现服务器发送的事件?

如何在NodeJS中测试服务器发送事件(SSE)路由?

如何在Laravel中避免服务器发送事件的单一路由

如何在 Puppeteer 中拦截服务器发送的事件消息

服务器发送事件如何工作

服务器发送事件如何实现?

服务器端API中未定义Svelte / Sapper fetch / this.fetch

Sapper Svelte 博客从服务器获取数据

如何在Elm中捕获服务器事件

如何在Python Web应用程序中为状态更改通知生成服务器发送的事件?

如何在Ionic 2中发送对本地主机中运行的Node服务器的发布请求?

如何在sapper / polka中访问所有svelte组件的json数据文件

如何在svelte / sapper组件中相对于当前页面进行链接?

如何在我的 ubuntu 服务器中运行 .cpp?

如何在线程中运行aiohttp服务器?

如何在Python的线程中运行zeroRpc服务器?

如何在测试中运行服务器?

如何在xampp服务器中运行MySql?

如何在Android中使用服务器发送的事件(SSE)?

如何在express.js中使用服务器发送事件

服务器端Flask中的服务器发送事件完成后如何重定向?

事件源;服务器发送的事件

如何对服务器发送的事件进行负载测试

HTML5服务器发送事件如何工作?

如何配置HAProxy以处理服务器发送的事件?

C#Winform捕获服务器如何发送事件

如何增加服务器发送事件的重新打开时间?