2014-03-29 41 views
0

Worklight 6.1在Windows(同事)和Mac(我)上構建了一個面向Android設備的混合應用程序,但爲加快開發速度,我們在桌面上的Chrome瀏覽器中作爲移動Web應用程序進行初始測試。Worklight JSON Store,我們可以獲得競爭條件嗎?

我們得到了一個奇怪的症狀,我正試圖精簡到一個可重複的測試用例。我認爲當進入調試器並讓它運行時,我會看到不同的行爲。在我繼續之前,要檢查某種編碼模式是否可能是症狀的原因。

基本問題:在發出另一個請求之前,我們是否應該等待由JSONSTore請求對集合上的操作返回的promise的解析?以下更多解釋請參考

整體意圖是將一些數據加載到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中(沒有在調試器中執行),我們最終沒有報告錯誤,但只插入了一條記錄 - 實際上就像初始「空」存儲的快照一樣,並且每個添加正在處理該「空」副本。

寫完後,我現在非常相信上面描述的編碼模式容易受到某種競爭,更好的方法是建立一個要添加的文檔列表並將它們插入到單個操作中。

回答

2

更詳細的答案將在晚些時候推出,但現在我知道,這

上述編碼模式是脆弱的一種種族和 的是,更好的辦法是建立一個文件列表,以被添加並且 在一次操作中插入它們。

爲真。在瀏覽器中,JSONStore確實需要我們在發佈另一個請求之前等待一個請求的結果。推薦的方法是

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

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