javascript - 事件源并不代表每个客户端/ session 的信息

标签 javascript python server-sent-events aiohttp

我有一个 python 服务器端,它使用 SSE 发送请求。

这里是 python 代码的示例。它发送一个“ Action 状态”和 JS 必须处理(要做的事情)的数据:

async def sse_updates(request):
    loop = request.app.loop
    async with sse_response(request) as resp:
        while True:

            # Sending request for queue' token remove when it's been removed on server.
            if request.app['sse_requests']['update_queue_vis_remove']:
                await resp.send("update-remove")
                request.app['sse_requests']['update_queue_vis_remove'] = False

            # Sending request for queue' token adding up when it's been added on server.
            if request.app['sse_requests']['update_queue_vis_append'][0]:
                await resp.send(f"update-append {request.app['sse_requests']['update_queue_vis_append'][1]} {request.app['sse_requests']['update_queue_vis_append'][2]}")
                request.app['sse_requests']['update_queue_vis_append'][0] = False

            # Sending request for redundant token's list rewrite (on client side ofc)
            if request.app['sse_requests']['redundant_tokens_vis'][0]:
                await resp.send('update-redtokens ' + ''.join(token + ' ' for token in request.app['sse_requests']['redundant_tokens_vis'][1]))
                request.app['sse_requests']['redundant_tokens_vis'][0] = False

            await asyncio.sleep(0.1, loop=loop)
    return resp

以及处理响应的 JS 脚本:

evtSource = new EventSource("http://" + window.location.host + "/update")

evtSource.onmessage = function(e) {
    // Data from server is fetching as "<server-event-name> <data1> <data2> <data3> ..."
    let fetched_data = e.data.split(' ');

    // First option is when a token has been removed from server this event has to be represented on a client-side.
    if(fetched_data[0] === "update-remove")
        displayQueueRemove();

    // The second option is when a token appended on server and also it should be represented to a user
    else if(fetched_data[0] === "update-append")

        // fetched_data[1] - token
        // fetched_data[2] - it's (token's) position
        displayQueueAdd(fetched_data[1], parseInt(fetched_data[2]));

    // The last possible options is that if the web-page will has refreshed a data in redundant_tokens should be rewritten
    else if (fetched_data[0] === "update-redtokens"){

        fetched_data.shift();

        // Creating variables for token' wrapping
        let tag;
        let text;

        // Wrapping tokens and store it into the array.
        for(let i = 0; i < fetched_data.length - 1; i++) {
            tag = document.createElement("div");
            text = document.createTextNode(fetched_data[i]);
            tag.appendChild(text);
            tag.setAttribute("class", "token-field");
            redundant_tokens[i] = tag;
        }
    }
}

问题是,如果我打开两个或多个浏览器窗口( session ),只有其中一个会捕获响应并表示它。此外,在某些情况下,我从一个 session 发送请求,但获得另一个 session 的响应。 是否可以选择使用 SSE 来修复它(我的意思是,我正在考虑其他一些方法,但我想尝试使用 SSE)?

最佳答案

我认为您的问题是同步数据(app["sse_requests"])。
根据您修改数据的方式以及需要通知的人员,您可能需要保留客户端( session )列表。

例如,如果所有客户端都需要收到所有事件的通知,则保留已连接客户端的列表(或者更好的集合)并创建一个周期函数(使用create_task),在其中通知所有任务。

如果客户端只需要收到某些事件的通知,那么您需要使用 request 对象中的某种键来识别该客户端。

关于javascript - 事件源并不代表每个客户端/ session 的信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61575275/

相关文章:

javascript - 下划线Js将函数改为对象

小数选项大于 2 的 python np.round()

websocket - Server-Sent Events 是在每次从服务器发送事件时发送 header ,还是仅在创建连接时发送?

ios - 如何使用 Firebase 在 IOS 上实现 Server-Sent Events?

javascript - 如何检测照片/视频是从相机拍摄的还是从 iphone safari 中的相机胶卷导入的

javascript - 从 mysql 刷新谷歌地图标记

javascript - 用 JavaScript 制作一个 Discord 机器人 : Attempting to make a game of wordchain between two players

java - 用 Java 解密 AES 编码的消息(用 Python 加密)

python - Ctypes wstring 通过引用传递

javascript - 是否使用 WebSocket 或服务器发送事件从实时检索社交网络状态的服务器发送通知?