2013-11-05 56 views
1

因此,我們有一個現有的,相當大的應用程序使用同步JavaScript API。在這種情況下,Google Gears SQL。我們正試圖爲我們的客戶演示可以讓應用程序在不支持齒輪的平臺上工作(在本例中爲iOS),如果他們喜歡他們看到的內容,我們將使用HTML5以正確的方式重做整個應用程序localStorage,但現在我們需要使用Web SQL來運行,即使效果很差。當然問題是Web SQL是異步的,Gears SQL是同步的。我們已經有了一個抽象概念,我們正在使用這個抽象概念來討論齒輪,所以如果我們想改變這個抽象來與Web SQL交談。我嘗試使用像這樣的方法:http://jsfiddle.net/ZCD4u/來僞造同步行爲,但Web SQL查詢在阻止時從未執行過。我也嘗試把所有的數據庫資料放到一個網絡工作者的腦海裏,以爲它會阻止頁面,但是無論如何都要執行SQL。問題在於,當我的睡眠循環仍然阻塞時,正在等待工人回聽的監聽程序從未被觸發。我需要的是一種修改使用同步API的抽象的方法,以便在不改變我自己抽象的API的情況下使用異步API。也就是說,如果當我完成抽象時,它會嚮應用程序的其餘部分公開一個回調機制,那麼我就失敗了。更具體:將異步API轉換爲同步API。 (我有充足的理由保證)

,我不允許改變

文件:

var sql = 'SELECT things FROM tables'; 
var res = myCoolAbstraction(sql); 
dothings(res); 

文件,我需要改變,以便它可以使用Web SQL,而不是齒輪:

var myCoolAbstraction = function(sql) { 
    return doGearsThing(sql); 
}; 

解決方案是沒有按't不工作,因爲sleep在Javascript中不是真實的東西:

var myCoolAbstraction = function(sql) { 
    var res; 
    doWebSQLThing(sql, function(d) { 
     res = d; 
    }); 
    while (res === undefined) { 
     sleep(100); 
    } 
    return res 
}; 

任何解決方案th上述第一個代碼塊中的代碼的行爲或內容發生更改時失敗。

編輯:我懷疑這是不可能完成的,我們正在研究此演示的其他選項,但我很想知道是否有人有解決方案。

+1

我不確定它是否直接解決了您的需求,但幾天前我偶然發現了jQuery BlockUI插件:http://www.malsup.com/jquery/block/ – Barmar

+0

可能出現[Call An Asynchronous Javascript功能同步](http://stackoverflow.com/questions/9121902/call-an-asynchronous-javascript-function-synchronously) – Barmar

+2

今天早上我會說這是不可能的。然後我偶然發現了這個聰明,聰明,但又狠狠的黑客。請記住,擁有巨大的權力來承擔責任_。明智地使用它:http://stackoverflow.com/questions/8448218/how-to-call-an-asychronous-javascript-function-and-block-the-original-caller#answer-8453862 –

回答

1

WebSQL是異步API。無法將異步函數轉換爲同步函數,因爲它依賴於運行至完成執行模型。這意味着回調函數只有在當前執行堆棧完成後纔會調用。

但是在新的ecmascript標準中有generator,它允許暫停執行上下文。每個yield語句都會暫停執行。您可以使用該功能來寫線性工作流程,同時數據庫請求是異步,如下:

var db = new ydn.db.Storage(db_name, schema); 
db.spawn(function* (tdb) { 
    var value_1 = yield tdb.get('st', key_1); 
    value_1.amount += 10; 
    var key_1 = yield tdb.put('st', value_1); 
    var value = yield tdb.get('st', key_1); 
    console.log(value); 
};, ['st'], 'readwrite')); 

可以與和諧的標誌測試Firefox上this unit test夜間和Chrome。

+0

謝謝,不幸的是,這並不能解決問題,因爲我們需要它在不支持良率的地方工作。 – olleicua