首页 > 解决方案 > 如何使用 socket.io 实时更新对象中的值

问题描述

我正在尝试使用 react、node 和 socketIO 创建一个股票交易模拟器,我需要将用户拥有的股票保存在这样的对象中:

var user = { 
    name: "patrick",
    portfolio: [
        {
            ticker: "AAPL", 
            sharesOwned: 5, 
            currentPrice: {
                ticker: "MSFT", 
                sharesOwned: 10, 
                currentPrice: "120.12"
            }
        }
    ]
}

问题是,我想CURRENT实时显示用户拥有的股票列表以及市场价格。


我通过遍历用户在后端拥有的每只股票并调用 IEX API 来给我一个新价格并在永远循环中像这样更新 currentPrice 来实现这一点:

user.portfolio.currentPrice = await getStockPrice();

假设我创建了一个名为getStockPrice(). 当然,循环将被包装在一个异步函数中以使用 await。

这样做确实会实时更新列表,但程序必须先循环遍历用户拥有的每只股票,然后返回具有更新价格的新投资组合,然后通过 socketIO 发送给客户端。这个过程每秒钟发生一次~3,实时流由setInterval后端的 a 处理,每 4 秒计时一次。

正确看待它,使用 MongoDB,我可以通过以下方式更改数据结构以存储项目:

var user = { 
    name: "patrick",
    portfolio: {
        aapl: { shares: 5, currentPrice: 2121 }
        msft: { shares: 10, currentPrice: 24242 }
    }
}

O(logn)如果我没记错的话,在这里用 MongoDB 索引会给我。但是我仍然需要循环才能知道我想得到哪只股票的价格,它仍然是O(n).

所以总的来说,我认为这O(logn + n)对于实时流媒体应用程序来说是非常糟糕的。

O(logn)假设我们没有考虑 api 响应所需的时间,我如何使用 react 和 socket 来解决这个问题而不必循环并保持这个至少?

如果我的分析有误,请纠正我。

标签: node.jsmongodbwebsocketsocket.ioreal-time-updates

解决方案


推荐阅读