【发布时间】:2015-07-27 23:01:48
【问题描述】:
使用 submitDelta、setValue、clearValue 和 getState 设置和获取值时,我得到不一致的结果。这些似乎是异步方法,所以我的同步命令(例如,console.log)使用本地数据对象执行。然后最终共享数据对象更新,进而更新本地数据对象。这是一个正确的评估吗?有没有办法同步运行这些数据命令,即等待共享数据对象更新后再继续程序?
【问题讨论】:
标签: google-plus hangout
使用 submitDelta、setValue、clearValue 和 getState 设置和获取值时,我得到不一致的结果。这些似乎是异步方法,所以我的同步命令(例如,console.log)使用本地数据对象执行。然后最终共享数据对象更新,进而更新本地数据对象。这是一个正确的评估吗?有没有办法同步运行这些数据命令,即等待共享数据对象更新后再继续程序?
【问题讨论】:
标签: google-plus hangout
是的,Hangouts API 中的数据操作是异步的。要实现同步,您必须收听 onStateChanged events 并仅继续您在这些事件中所做的任何事情。
将为所有参与者调用该事件,包括触发更改的本地参与者。
【讨论】:
似乎不可能编写同步共享数据对象调用,因为如果您的代码中有多个 onStateChange,它们会一起触发。换句话说,我不能将一个共享数据对象更新绑定到一个 onStateChange。
看起来 Google+ 环聊按以下顺序执行数据库 API:
获取和设置本地数据对象中的值(使用getState)
使用 getState 从共享数据对象中获取值。
更改共享数据对象中的值(setValue、clearValue、submitDelta 等)。
onStateChange 监听共享数据对象的变化。
以下(伪)代码
setValue('counter', '11')
getValue('counter')
onStateChanged (getValue('counter'))
submitDelta( {'counter': '22'} )
getValue('counter')
onStateChanged (getValue('counter'))
clearValue('counter')
getValue('counter')
onStateChanged (getValue('counter'))
submitDelta( {'counter': '33'} )
getValue('counter')
onStateChanged (getValue('counter'))
会回来
undefined
undefined
undefined
undefined
33
33
33
33
33
33
33
33
33
33
33
33
33
33
33
33
因为四个getValue先执行,然后是setValue、submitDelta、clearValue、 submitDelta 执行,然后四个 onStateChanged 一起执行,每个执行四次,因为共享数据对象被更改了四次。
听起来对吗?
【讨论】: