2013-03-11 105 views
0

這是一個非常簡單的一個我猜(但JS是不是我最好的朋友和我卡...)從函數返回一個變量

我怎樣才能返回rows價值? (這是不確定的......)

function myFunction(table){ 
    html5sql.process(
    ["SELECT * FROM "+table], 
    function(transaction, results, rowsArray){ 
     rows = rowsArray; // rows is defined here 
    }, 
    function(error, statement){ 
    }); 
    return rows; // rows is not defined here :(
} 
+0

作爲函數的第一行:'var rows;'。現在,'rows'只在內部函數的範圍內定義,所以一旦它返回到你想要返回它的地方,它就不再存在了。通過在給它分配任何東西之前聲明它,你確保名爲'rows'的變量具有賦值給它的變量是可以返回的變量。 – jonhopkins 2013-03-11 17:40:39

回答

4

你現在可能無法做到這一點。由於JS默認是異步的,即使在任何回調運行之前,rows也會被返回。由於成功回調是設置rows,您將始終返回未設置或陳舊的值。

(注:。我從來沒有使用html5sql這可能是圖書館剛剛提出,看起來異步而不知何故實際工作同步的接口,但如果這樣做,這將會是相當不尋常在這方面)

一個可能的解決方法是自己接一個回調函數,一旦你得到它們,就調用並傳遞行。

function myFunction(callback){ 
    html5sql.process(
    ["SELECT * FROM "+table], 
    function(transaction, results, rowsArray){ 
     callback(rowsArray); 
    }, 
    function(error, statement){ 
    }); 
} 

// and use it like this 
myFunction(function(rows) { 
    // do stuff with rows in here 
}); 

或者,只是使用callback作爲第二對Arg的process,如果你想偷懶。只要知道它將通過所有三個參數,這個函數的調用者不應該關心。 :P

+0

非常感謝! – Yako 2013-03-12 07:33:40

0

分配之前聲明rows值:

function myFunction(){ 
    var rows; 
    html5sql.process(
    ["SELECT * FROM "+table], 
    function(transaction, results, rowsArray){ 
     rows = rowsArray; // rows is defined here 
    }, 
    function(error, statement){ 
    }); 
    return rows; // rows is not defined here :(
} 

這改變了變量的作用域,並使其可見和內部功能的外部訪問也是如此。

0

微小的變化......

function myFunction(){ 
    var rows; 

    html5sql.process(
    ["SELECT * FROM "+table], 
    function(transaction, results, rowsArray){ 
     rows = rowsArray; 
    }, 
    function(error, statement){ 
    }); 
    return rows; 
} 

你得到一個未定義的,因爲你還沒有真正定義它,它 - 在函數的開頭這樣做會使其特定於該範圍,應該正確地返回。