Worklight JSON商店,我们可以获得竞争条件吗?

时间:2014-03-29 10:40:40

标签: ibm-mobilefirst jsonstore

Windows(同事)和Mac(我)上的Worklight 6.1,构建了一个专门针对Android设备的混合应用程序,但为了加快开发速度,我们在台式机上的Chrome浏览器中进行初步测试,作为移动Web应用程序。

我们得到了一个奇怪的症状,我正试图将其归结为可重现的测试用例。我认为在进入调试器并让它运行时我会看到不同的行为。在进一步研究之前,想要检查某种编码模式是否可能是症状的原因。

基本问题:我们是否应该在发出另一个请求之前等待JSONSTore对集合上的操作请求返回的承诺的解析?下面有更多解释。

总体意图是将一些数据加载到JSONStore中,如果已经存在记录,则使用一些智能替换/合并操作。伪代码:

  for each record retrieved from back-end

        if ( record already present in Store )
              do some data merging 
              replace record
        else
              add record

应用程序代码实际上是这样工作的,只考虑add()情况,当存储为空时问题显现,需要添加所有记录

  for each record to add 
        addPromise = store.get().add(record);
        listOfPromises.insert(addPromise);

  examine the list of promises recording any errors

在发出下一个添加请求之前,没有“等待”添加完成。因此,实际上我们已经启动了一组“并行”添加,无论Chrome中的JavaScript可能意味着什么。

代码似乎运行正常,没有报告错误。在Android设备上它可靠地工作。在正常运行的Chrome中(没有调试器中的步进)我们最终没有报告错误但只插入了一条记录 - 事实上好像已经采取了初始“空”存储的快照,并且每个添加正在处理该“空”副本

写完这篇文章后,我现在相信上面描述的编码模式容易受到某种竞争的影响,而更好的方法是构建一个要添加的文档列表并将它们插入到一个操作中。

1 个答案:

答案 0 :(得分:2)

稍后会有更详细的答案,但我现在知道了这个

  

上面描述的编码模式容易受到某种竞争的影响   更好的方法是建立一个要添加的文档列表   将它们插入一个操作中。

是真的。在浏览器中,JSONStore确实要求我们在发出另一个请求之前等待一个请求的结果。建议的方法是

var dataToAdd = buildArrayOfDataToAdd(responseFromServer);
var dataToReplace = buildArrayOfDataToReplace(responseFromServer);

jsonstore.add( dataToAdd ).then( function() { jsonstore.replace( dataToReplace); })