2013-05-15 88 views
0

嗨,我們正在創建一個使用javascript函數返回數據庫中的值的Phonegap程序,問題是我無法返回值,因爲它們處於遞歸函數中,每次一個調用的主要功能它沒有任何retusn在遞歸函數中不能返回變量javascript

代碼:

function exporta_imoveis(){ 
    var db = window.openDatabase("Ithomes", "1.0", "Cordova Demo", 200000); 
    db.transaction(function coletandovisitas(tx){ 
    alert('Coletando imoveis no BD local '); 
    tx.executeSql('SELECT * FROM IMOVEIS', [], function percorrendolinhas(tx, results){ 
     var len = results.rows.length; 
     var array_retorno = new Array(); 
     for (var i=0; i<len; i++){ 
     array_retorno[i] = results.rows.item(i); 
     } 
     return array_retorno; 
    }, function err(){ alert('erro ao coletar') });    
    },function erro(){ alert('erro ao coletar dados dos imoveis') }, function acerto(){ alert('Dados dos imoveis coletadas com sucesso')}); 
} 

我需要得到array_retorno變量的值,請幫忙

+0

我不能發現其中的遞歸是,你可以點我一條線嗎? –

+0

裏面有很多函數,第一個是exporta_imoveis女巫裏面有db.transaction,裏面有它的coletandovisitas,裏面有tx.executesql,裏面有percorrendolinhas,我需要得到的值調用exporta_imoveis()時array_retorno的方法 –

+1

那不是遞歸,它是嵌套函數。 –

回答

2

您遇到的問題與遞歸無關,但與異步函數無關。當您的數據庫操作完成時,您傳遞給executeSql的函數percorrendolinhas將會執行,但主函數的其餘部分可能會首先執行。因此,你應該使用回調:

function exporta_imoveis(callback){ 
    var db = window.openDatabase("Ithomes", "1.0", "Cordova Demo", 200000); 
    db.transaction(function coletandovisitas(tx){ 
    alert('Coletando imoveis no BD local '); 
    tx.executeSql('SELECT * FROM IMOVEIS', [], function percorrendolinhas(tx, results){ 
    var len = results.rows.length; 
    var array_retorno = new Array(); 
    for (var i=0; i<len; i++){ 
     array_retorno[i] = results.rows.item(i); 
    } 
    callback(array_retorno); 
    }, function err(){ alert('erro ao coletar') });    
    },function erro(){ alert('erro ao coletar dados dos imoveis') }, function acerto(){ alert('Dados dos imoveis coletadas com sucesso')}); 
}  

您可以通過以下方式現在調用你的函數:

exporta_imoveis(function (array_retorno) { 
    //do something with array_retorno 
}); 
+0

Thannnks真的救了我= D –

0

我認爲你可以移動var array_retorno = new Array();以外的exporta_imovis功能。現在你不能訪問數據,因爲該變量只存在於你的函數的範圍內 - 只要你離開這個函數,變量就會消失。

+0

問題是,這個函數可能會返回一個空數組。由於executeSql的異步特性,數組在被函數percorrendolinhas填充之前將被返回。 – basilikum

+0

嗯,是的,我認爲你是對的。 – MBillau

1

我有點用的名字和你想達到什麼樣的困惑,但如果你傳遞一個回調如下:

function exporta_imoveis(callback){ 
    var db = window.openDatabase("Ithomes", "1.0", "Cordova Demo", 200000); 
    db.transaction(function coletandovisitas(tx){ 
    alert('Coletando imoveis no BD local '); 
    tx.executeSql('SELECT * FROM IMOVEIS', [], function percorrendolinhas(tx, results){ 
     var len = results.rows.length; 
     var array_retorno = new Array(); 
     for (var i=0; i<len; i++){ 
     array_retorno[i] = results.rows.item(i); 
     } 
     callback(array_retorno); 
    }, function err(){ alert('erro ao coletar') });    
    },function erro(){ alert('erro ao coletar dados dos imoveis') }, function acerto(){ alert('Dados dos imoveis coletadas com sucesso')}); 
} 

,那麼你應該能夠做到:

exporta_imoveis(function(array_retorno) { 
    // here you will have array_retorno, do what you need on it 
}); 

如果您不想傳遞迴調函數,那麼@MBillau是一種替代方法。

只是你如何能簡化結構指針:嘗試使用其中的主要邏輯是,像這樣的代碼部分之外定義命名功能:

function coletandovisitas(tx){ 
    alert('Coletando imoveis no BD local '); 
    tx.executeSql('SELECT * FROM IMOVEIS', [], function percorrendolinhas(tx, results){ 
    var len = results.rows.length; 
    var array_retorno = new Array(); 
    for (var i=0; i<len; i++){ 
     array_retorno[i] = results.rows.item(i); 
    } 
    callback(array_retorno); 
} 

function exporta_imoveis(callback){ 
    var db = window.openDatabase("Ithomes", "1.0", "Cordova Demo", 200000); 
    db.transaction(coletandovisitas, function err(){ alert('erro ao coletar') });    
    },function erro(){ alert('erro ao coletar dados dos imoveis') }, function acerto(){ alert('Dados dos imoveis coletadas com sucesso')}); 
} 

好像更清晰一點。

+0

Thannnks真的救了我= D –

+0

heheh很高興它幫助! –