我正在嘗試通過使用 html 和 Js 構建一個簡單的游戲來學習,在后端使用 Nodejs 和貓鼬。它就像一個網格,您可以在其中單擊以四處移動,并且您必須到達寶藏。當你點擊寶物瓦片時,后端從mongodb獲取wincode并發送給前端。
miApp.allGames 是一個陣列,我在其中存盤一個“currentUserInfoMov”物件,其中包含當前正在玩的每個游戲的資訊,一個用于使用本地存盤的瀏覽器,它作業正常。
我的問題是,movementsEmitter 不會等到它從 Mongodb 獲取代碼。在我的控制臺中,我可以按以下順序查看 console.logs:
1.你贏了!
2.發送到前面
3.發射器完成
routerApi.post("/clicked", async (req, res) => {
try {
miApp.movementsEmitter.emit("playerWantToMove", req.body, grid);
const currentUserInfoMov = miApp.allGames.filter(x => x.Id == req.body.id)[0];
res.send(currentUserInfoMov);
console.log("Sent to Front");
} catch (error) {
console.log(error)
}
})
在運動發射器上:
movementsEmitter.on("playerWantToMove", async (tileClickedAndId, grid) => {
...more code here working fine...
if (playerDestiny == treasureTile) {
console.log("you win!");
const bottle = await Bottles.findById(BOTTLEID);
currentUserInfoMov.winCode = bottle.codeToWin;
TakeBottle();
console.log("Emitter finished");
}
}
uj5u.com熱心網友回復:
根據您的代碼,一切都按預期進行。
- 您正在發出
playerWantToMove事件 - 事件
on處理程式被稱為 => 并被console.log("you win!")呼叫 - 您正在等待對瓶子的請求。這是一個異步請求并被移動到作業佇列,直到呼叫堆疊為空。
- 然后代碼繼續執行您的
.post塊 => 并被console.log('sent to front')呼叫 - 呼叫堆疊現在是空的,所以該
awaited行下面的代碼運行 => 并且Emitter finished呼叫了 console.log()
所以你需要重新排序你的代碼。如果您想以不同的順序執行,只需將 移至emitafter res.send。不過,我的猜測是,它會takeBottle更新資料庫,從而更新您發送到前端的回應。您可以嘗試await發出的事件(如果您的事件發射器允許。await miApp.movementsEmitter.emit("playerWantToMove", ...)另一個選項是更新事件處理程式以res.send()在其中呼叫,之后TakeBottle()呼叫
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/505658.html
