2012-02-24 78 views
2

從c#背景來看,我可能從完全錯誤的角度看待JavaScript,所以請耐心等待。如何處理JavaScript中的異步函數結果

留下async的優點,擱置一分鐘, 比方說,我只是想從HTML5頁面中的SQLite數據庫中檢索一個值。 我希望看到的是一樣的東西

var something = db.getPicture(1); 

現在考慮一個(也許很幼稚)實現這一點:

this.getPicture(id) 
{ 
    this.database.transaction(function(tx) 
    { 
     tx.executeSql('SELECT ......', null, function(tx, results) 
     { 
      if (results.rows.length == 1) 
       return results.rows.items(0).Url; //This of course does not resturn 
                //anything to the caller of .getPicture(id) 
     } 
    }, 
    function(error) 
    { 
     //do some error handling 
    }, 
    function(tx) 
    { 
     //no error 
    });      
} 

首先,它是嵌套函數和第二個大混亂......我無法將我從數據庫中得到的結果作爲.getPicture()函數的值返回。

這是最簡單的版本,如果我想從一個表retreive指數第一, 然後使用該指數在接下來的查詢等什麼...

這是正常的JavaScript開發者,我是否完全錯誤,是否有解決方案等...

+2

是的,你完全錯了:-)爲了處理事物的異步性,你需要傳遞* callback *函數。那些由運行時系統調用的時候需要這樣做,所以從回調中返回值沒有任何意義。 – Pointy 2012-02-24 12:15:59

+0

爲了讓getPicture返回一些東西,需要在異步內容完成之前阻止getPicture的執行,並使用異步回調來填充返回變量。 – Alex 2012-02-24 12:21:35

+0

@Pointy:考慮將你的評論升級到答案 – 2012-02-24 12:22:17

回答

2

在JavaScript(在異步環境中,如Web瀏覽器或Node.js)中遵循的基本模式是,您需要做的工作操作完成應發生在API提供的「成功」回調中。在你的情況下,這將是傳遞給你的「executeSql()」方法的函數。

this.getPicture = function(id, whenFinished) 
{ 
    this.database.transaction(function(tx) 
    { 
     tx.executeSql('SELECT ......', null, function(tx, results) 
     { 
      if (results.rows.length == 1) 
       whenFinished(results.rows.items(0).Url); 
     } 
    }, 

在該設置中,數據庫操作的結果作爲參數傳遞給調用「getPicture()」時提供的函數。

因爲JavaScript函數形式爲關閉,它們可以訪問調用上下文中的局部變量。也就是說,您傳遞給「getPicture()」的函數作爲「whenFinished」參數將訪問活動在「getPicture()」點的局部變量。

相關問題