- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在用 nodejs 编写一个小型多人游戏。
当玩家加入时,我想将他们加载到游戏世界中他们要求的位置。但是,这个位置可能已被占用,如果是这样,我会四处寻找最近的可用空间并将它们加载到该位置。
我的做法如下:
function playerJoin(){
let playerTank = new Tank();
this.findEmptyArea(playerTank, 100, 100).then((result) => {
if (!result.success) {
return;
}
addObjectToWorld(playerTank, result.x, result.y);
}
}
function findEmptyArea(object, x, y){
return new Promise((resolve, reject) => {
// Psuedo code: code iterates over game objects testing for
// collisions . if the requested position is free uses that else
// finds an empty nearby location and returns it
return resolve({success: true, x: freeX, y: freeY});
// fails to find empty location for object
return resolve({ success: false });
}
}
这不是实际代码,而是一个精简版本,以使其更清晰。我的问题是:
当用户通过网络套接字连接时,函数 playerJoin 运行。然后它创建一个新的 player tank ,找到空闲区域并返回一个 promise,如果成功则 player tank 被添加到世界的位置。
仔细查看后,我想知道这段代码是否存在缺陷。 addObjectToWorld 是否有可能在实际上不是空闲的位置上被调用?
例如:
findEmptyArea promise 为 player2 找到一个免费的10,10 处的空格并返回 promise。
.then() Promise 代码块在 playerJoin 中(在 findEmptyArea 之后)让玩家 1 运行,将玩家置于 10,10 通过添加对象到世界
所以我想我的问题是,当一个 promise 解决时,.then 代码块会立即运行吗?运行 addObjectToWorld 的代码块会立即运行,还是其他代码可能会首先运行(例如另一个玩家也在寻找空闲区域)
谢谢你的帮助
最佳答案
因为 findEmptyArea
是异步的,所以它很可能访问外部的东西,对吧?
Node.js 是用于执行 JS 代码的单线程(尽管在最新版本中有实验性的多线程功能)。但是 Node.JS 使用子线程来访问外部资源。因此,只有当您访问文件等外部资源或执行 API 请求时,您才会出现竞争条件。
如果您执行 API 请求,您访问的资源将负责确保它仅返回一次 true
以防止竞争条件。
但是,如果您只检查 Promises 中的本地对象,您就不应该有任何竞争条件(只要您不使用 setTimeout
和类似的东西)。 Node.JS 事件循环将一次执行每个已解决/拒绝的 Promise 的代码。这意味着一旦 Promise 被解决,then
代码块就会被执行。
我找到了 this article结合 Promises 对事件队列有帮助。
您问题的答案取决于 findEmptyArea
检查空白区域的方式。
一些编码建议:
调用resolve
和reject
时不需要使用return
。你可能想使用 reject
因为你提到了变量:
this.findEmptyArea(playerTank, 100, 100).then((result) => {
addObjectToWorld(playerTank, result.x, result.y);
}).catch((err) => {
// findEmptyArea failed because the Promise was "rejected"
});
return new Promise((resolve, reject) => {
// On success call this
resolve({x: freeX, y: freeY});
// On failure call this
reject();
});
关于javascript - 我的 NodeJS promise 代码竞争条件安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55592289/
假设我正在使用 APC,其中过程和调用代码都使用 SetLastError 和 GetLastError。这会导致 GetLastError 产生不可预测的值。有什么办法可以解决这个问题吗? VOID
关闭。这个问题是opinion-based .它目前不接受答案。 想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题. 7年前关闭。 Improve t
任何人都可以,请告诉我,如何在不进行JavaScript轮询/ setInterval的情况下,在完整日历上填充/显示在服务器端动态更新的数据。 grails中提供了Atmosphere插件,但是文档
我正在尝试调整我的代码,从仅在前台使用 WCSessionDelegate 回调到在后台通过 handleBackgroundTasks: 接受 WKWatchConnectivityRefreshB
我正在构建批处理系统。 单位 的批处理数量从 20 到 1000 不等。每个 Unit 本质上都是模型的层次结构(一个主模型和许多子模型)。我的任务涉及将每个模型层次结构作为单个事务保存到数据库中(每
我拍了一张图片并将其切成三 block ,然后将它们向右浮动,让文字围绕它们流动。 HTML 看起来像这样: 在我添加侧边栏并将其 float 到图像的右上方之前,它工作正常,就像这样... T
我正在考虑嵌入式 Linux 项目(还没有硬件)中即将出现的情况,其中两个外部芯片需要共享一条物理 IRQ 线。这条线在硬件中能够实现边沿触发,但不能实现电平触发中断。 查看 Linux 中的共享 i
我观察到,当 linux futexes 发生争用时,系统会在自旋锁上花费大量时间。我注意到即使不直接使用 futex 也是一个问题,但在调用 malloc/free、rand、glib 互斥调用和其
我终于能够获得一些工具提示,最终可以使用以下代码: Hover over me 然后 $('[rel=tooltip]').tooltip(); 我遇到的问题是它使用 jQueryUI 工
我是一名优秀的程序员,十分优秀!