【发布时间】:2014-11-23 05:07:43
【问题描述】:
我刚开始在 JavaScript 中使用 Promises,使用 Q library。我遇到了竞争状况,想知道解决它的最佳方法是什么。
问题是 Q 总是使用 process.nextTick() 调用回调(在 Promises/A+ 规范中也提到过),这意味着我可能会错过在承诺解决和时间之间的对象中的一些状态变化回调被调用。我的具体问题是我有一个传入连接并且缺少第一条消息。使用EventEmitter 分发消息。
代码看起来像这样。它使用palava-client(但问题应该是通用的)并且是用CoffeeScript编写的:
defer = q.defer()
session.on 'peer_joined', (peer) ->
defer.resolve(peer)
return defer.promise
还有别的地方
peer_promise.then (peer) ->
peer.on 'message', (msg) ->
console.log "Message received:", msg
第一条消息有时会丢失,因为它们在 Promise 得到通知之前就发出了。仅使用 EventEmitter 和 Callbacks 不会出现此问题,因为回调总是会立即被调用,从而阻止 JavaScript 线程处理传入的消息。
以下代码永远不会错过消息:
session.on 'peer_joined', (peer) ->
peer.on 'message', (msg) ->
console.log "Message received:", msg
您认为我可以使用 Promise 解决问题的任何方法吗?我真的很想在我的抽象层中继续使用它们,以确保只接受一个对等点。有没有其他方法可以避免这种竞争条件?
【问题讨论】:
-
尝试阅读 jQuery 文档中的“$.Callbacks、$.Deferred 和 Pub/Sub”部分。它可能会鼓励你朝着有用的方向前进,即使你最终没有使用 jQuery。
标签: javascript promise race-condition q