2016-01-13 75 views
0

我在一個expressjs + sqlite小webapp中工作,供本地使用。但我的問題是,當我想在桌子上做一個完整的選擇。我所有的腳本都在JScript中以'use-strict'模式運行。如何編寫一個清晰的Select語句來返回一個數據列表?

我想做一個SELECT語句並收集名爲listadata的json數組中的數據。但問題是:直到我沒有在module.exports組之外聲明這個變量 - 即。作爲一個全局變量 - 我不能返回任何行的列表。如果我刪除該聲明,我的函數不會返回任何內容。

該模塊必須返回完整的行列表。請任何人都可以解釋爲什麼我必須將這個變量聲明爲全局變量?或者,有沒有辦法根據Javascript以更優雅的方式處理這種聲明?

var listadata = []; 

module.exports = { 
listas2 : function(){ 
    var db = sqlite.connect(); 
    db.all("SELECT * FROM TBWOHPARG", function(err,rows){ 
     listadata = []; 
     rows.forEach(function(row){ 
      listadata.push({ 
       _id: row._id, 
       descripcion: row.descripcion, 
       fechacreacion: row.fechacreacion, 
       fechamodificacion: row.fechamodificacion, 
       referencia: row.referencia 
      }); 
     }); 
    }); 
    return listadata; 
} 
+0

''use-strict'' - so,not in strict mode then –

+0

可能重複[如何從異步調用返回響應?](http://stackoverflow.com/questions/14220321/how-我做了一個異步調用的迴應) –

+0

對不起,但在我的情況Im從節點服務器端編碼。 Ajax它在我的問題範圍之外。 – MigRome

回答

0

db.all是異步的,所以你將回到listadata它使用回調填充

之前,你可以這樣做

listas2 : function(callback){ 
    var db = sqlite.connect(); 
    db.all("SELECT * FROM TBWOHPARG", function(err,rows){ 
     listadata = []; 
     rows.forEach(function(row){ 
      listadata.push({ 
       _id: row._id, 
       descripcion: row.descripcion, 
       fechacreacion: row.fechacreacion, 
       fechamodificacion: row.fechamodificacion, 
       referencia: row.referencia 
      }); 
     }); 
    }); 
    callback(listadata); 
} 

但是當你調用listas2你可以不要做

something = listas2(); 
// do things with something 

它需要是

listas2(function(something) { 
    // do things with something 
} 

這是代碼重複的問題相同的模式,只是你使用的是不同的異步函數,即代替db.all$.ajax

還有在重複一個promise解決方案,我不會重現

+0

謝謝!...這種解釋方式與以前完全不同。 :) – MigRome

+0

不是真的 - 它是相同的「模式」:頁碼 –

相關問題