2013-07-16 31 views
0

我有以下功能:如何從嵌套的jquery函數返回?

function query(db, querystr){ 

    var resultSet; 

    db.transaction(function(tx){ 

     tx.executeSql(querystr, [], function(tx, results){ 


      console.log("ROWS ---> "+results.rows); 

      resultSet = results.rows; 

     }, dbError); 

    }, dbError, dbSuccess); 

    return resultSet; 

} 

我怎樣才能results.rows在主函數,這樣我可以返回給調用者?

假設主叫方確實是這樣的: var result_rows = query(db, 'select 1 from dual');

我怎樣才能確保result_rows會從tx.executeSql嵌套函數的results.rows價值?我在這個例子中調用者的方式未定義。

謝謝 TS

+1

像AJAX一樣,Javascript數據庫是異步的,並且該函數在事務發生之前返回。您必須在回調函數中執行所有操作,而不是返回值。 – Barmar

+0

我可以在嵌套函數中更改全局變量嗎? –

+0

當然可以。 – Barmar

回答

0

嘗試這樣的事情。將回調函數傳遞給query()函數,並在executeSql函數執行後調用它。

function query("ss","querystr" function (data){ 
//data contains results.rows from query function 
}); 

function query(db, querystr, cb){ 

    db.transaction(function(tx){ 

     tx.executeSql(querystr, [], function(tx, results){ 

      cb(results.rows); 
      //console.log("ROWS ---> "+results.rows); 

      resultSet = results.rows; 

     }, dbError); 

    }, dbError, dbSuccess); 
} 
+0

完美...回調函數。這更多的是我正在尋找的東西。非常感謝Sunny! –

0

對於初學者來說,Barmar的評論是正確的:你永遠無法真正保證數據回來在同一個JavaScript線程/堆棧/無論你怎麼稱呼它,所以你不能只是返回。

對異步檢索項執行某些操作的最常見模式是,請求函數應傳遞一個將被調用的onSuccess函數,並將結果數據作爲參數進行調用。這種模式對性能要好得多,因爲UI線程沒有被阻塞。

var pizza = getMeAPizza('pepperoni'); 
console.log('Yesss, got my pizza.'); 

//becomes... 

getMeAPizza('pepperoni', function(pizza) { 
    console.log('Yesss, got my pizza.'); 
} 

我認爲,如果你正在開發一個jQuery插件,像你說的,從我的理解,一個常見的模式是在返回時實行「Deferred」對象的定義,因此調用這個函數可以鏈以下行動。這部分是我的第二手知識,所以我不打擾拼命解釋它...