很疑惑啊。。。我把我的代码和版本什么的都贴出来,还有我的试验结果。。。我的结论还是第一个"await" 是正常 "send" 出去了的。
«1. 先贴结果»
* 浏览器的结果
"image.png" (https://wmlx-new-image.oss-cn-shanghai.aliyuncs.com/images/20241022/2f128fdd9489e45147010d6a13068034.png)
* 服务端的日志
"image.png" (https://wmlx-new-image.oss-cn-shanghai.aliyuncs.com/images/20241022/cfa19a0b877ac6aa7e154248e2916af6.png)
«2. 我的依赖环境»
fastapi = "^0.110.0"
uvicorn = {extras = ["standard"], version = "^0.28.0"}
websockets = "^12.0"
datasets = "^2.18.0"
«3. 我的示例代码»
为了能明确看出前后顺序差异,我加入了时间戳 "datetime.now()" 在每个信息内容上。
from datetime import datetime
from datasets import load_dataset
from fastapi import FastAPI, WebSocket
from fastapi.responses import HTMLResponse
app = FastAPI()
html = """
Chat
WebSocket Chat
Send
var ws = new WebSocket("ws://localhost:8081/ws");
ws.onmessage = function(event) {
var messages = document.getElementById('messages')
var message = document.createElement('li')
var content = document.createTextNode(event.data)
message.appendChild(content)
messages.appendChild(message)
};
function sendMessage(event) {
var input = document.getElementById("messageText")
ws.send(input.value)
input.value = ''
event.preventDefault()
}
"""
@app.get("/")
async def get():
return HTMLResponse(html)
@app.websocket("/ws")
async def h(ws: WebSocket):
await ws.accept()
await ws.send_text(f"1: {datetime.now()}")
dataset = load_dataset("beans")
print(f"time: {datetime.now()} => dataset: {dataset}")
await ws.send_text(f"2: {datetime.now()}")
while True:
data = await ws.receive_text()
await ws.send_text(f"Message text was: {data}, datetime: {datetime.now()}")
从我上面截图和我的实际操作来看,"1" 确实是先执行的,因为 "html" 接收到了 "ws" 的信息。
你可以拿我的去你那里在试验一下。。。