2012-03-20 127 views
0

我是javascript新手,無法找到解決方案。 我已經閱讀了一些類似的問題,但看起來並不像我的問題一樣。從函數返回'undefined'變量

我調用一個方法從SCRIPT1與此代碼:

function turnPage(){ 
    var current = window.now; 
    var nextpage = getNextPage(current); 
    alert(nextpage); 
} 

在SCRIPT2有一個SQLite等:

function getNextPage(Pid) { 
    db.transaction(function(tx) { 
     tx.executeSql('SELECT * FROM Page WHERE Pid=' + Pid, [], 
        function(tx, results) { 
      nextp = parseInt(results.rows.item(0).NextPage); 
      //alert(nextp); 
      return nextp; 
     }, errorCB); 
    }, errorCBQuery); 
} 

如果我用警報的對話框中被調用的函數,變量nextp是2. 但是,如果我返回變量,它會提醒爲'未定義'。 另外,如果我等變量var nextp = 11;通過「db.transaction ...」和函數末尾的return語句,它將返回11而不是2.

是因爲變量未在函數啓動時發送到內部函數? :)

任何想法做什麼?謝謝!

回答

1

我不知道JavaScript中的SQLite是如何工作的,但我懷疑它是異步工​​作的,所以你在turnPage中調用alert,但事務正在運行異步並且返回值在另一個範圍內。您可以嘗試通過一個回調函數來getNextPage然後,而不是作爲參數,返回nextp調用回調與nextp

function turnPage(){ 
    var current = window.now; 
    getNextPage(current, function (nextp) { alert(nextp); /* do whatever else you need to do */ }); 
} 



function getNextPage(Pid, cb) { 
    db.transaction(function(tx) { 
     tx.executeSql('SELECT * FROM Page WHERE Pid=' + Pid, [], 
        function(tx, results) { 
      nextp = parseInt(results.rows.item(0).NextPage); 
      cb(nextp); 
     }, errorCB); 
    }, errorCBQuery); 
} 
+0

Thans,它的工作! (如果有人使用此代碼,警告中有一個錯字,它應該是alert(nextp),而不是alert(nextpage) – TorK 2012-03-20 11:30:02

+0

gah,true。固定錯字。 – 2012-03-20 11:32:25

+0

@ user1255456記住接受答案,如果它解決了問題 – 2012-03-20 11:51:19

0

您的外部函數永不實際返回nextp在任何時間。

有兩種解決方案,以什麼(我覺得)你要做的

  1. 創建一個全局變量和存儲nextp存在的價值。
  2. 引入另一個回調以使用nextp的值,例如創建新鏈接或其他。如果你願意,你可以把代碼放在另一個函數中,並把它作爲參數傳遞給getNextPage(),或者直接把代碼放到最內部的函數中(在alert調用的位置)。

請注意,回調函數用於處理許多JavaScript API的異步性質。因此即使您的getNextPage()無法返回內部查詢的值,因爲該值不存在,當getNextPage()完成時。

無論如何,最內部函數中的return語句可以被刪除,因爲沒有實際接收該值的函數。

0

因爲它是現在,有幾個問題與您的代碼。

  1. 如JavaScript大多是asynchronus,你的代碼:

    nextpage = getNextPage(current); 
    alert(nextpage); 
    

    會打電話的getNextPage()但它不會等到移動之前的響應,因此警報會被馬上解僱,並在此點,如果沒有返回並分配響應(可能是這種情況),那麼nextpage將是未定義的。

  2. 你的第二個問題是你的外部函數不返回任何東西。你從內部函數返回值,但是在外部函數中「卡住」了。一種解決方案是將值賦給全局變量,而不是從函數中返回。您仍然必須注意「異步問題」,以便在分配全局變量之前不要讀取全局變量。