因此,我們有一個現有的,相當大的應用程序使用同步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上述第一個代碼塊中的代碼的行爲或內容發生更改時失敗。
編輯:我懷疑這是不可能完成的,我們正在研究此演示的其他選項,但我很想知道是否有人有解決方案。
我不確定它是否直接解決了您的需求,但幾天前我偶然發現了jQuery BlockUI插件:http://www.malsup.com/jquery/block/ – Barmar
可能出現[Call An Asynchronous Javascript功能同步](http://stackoverflow.com/questions/9121902/call-an-asynchronous-javascript-function-synchronously) – Barmar
今天早上我會說這是不可能的。然後我偶然發現了這個聰明,聰明,但又狠狠的黑客。請記住,擁有巨大的權力來承擔責任_。明智地使用它:http://stackoverflow.com/questions/8448218/how-to-call-an-asychronous-javascript-function-and-block-the-original-caller#answer-8453862 –