2011-09-16 30 views
1

我對NodeJS和JavaScript一般都很陌生。這裏是我的腳本:NodeJS回調之外的變量

var data = []; 

    client.query(

     'SELECT * FROM cds', 
     function selectCb(err, results, fields) { 

     if (err) { 
      throw err; 
     } 

     console.log(results); 
     console.log(fields); 

     data.push(results); 
     } 
    ); 

    console.log(data); 

我怎樣才能得到回調的外部訪問的results(或data)VAR?我不想在運行查詢時寫入大量的回調函數。

+0

我不確定我是否理解。這些回調的要點是,其餘代碼可以執行,不必等待查詢。因此,假設'results'是最後一行中'data'的元素沒有多大意義,因爲查詢還沒有完成。 – pimvdb

+0

我想我的設計是錯誤的,並希望有更好的解決方案。你知道如何使用node-mysql從查詢中獲取數據,而無需使用回調? – mikelbring

+0

這聽起來像你想要同步代碼,以便函數等待查詢結束。我不確定這是最好的方法。是否有任何理由不只是在回調中執行查詢的依賴關係? – pimvdb

回答

1

你要求的是同步(或阻塞)執行,這真的違背了node.js的設計和精神。

像JavaScript一樣,節點是單線程的。如果您有阻止代碼,則整個過程停止

這意味着您必須使用回調來處理需要很長時間的任何事情(例如從數據庫查詢)。如果你正在編寫一個貫穿整個過程的命令行工具,你可能願意忍受這個阻塞。但是,如果你正在編寫任何類型的響應式應用程序(如網站),那麼阻止就是謀殺。

所以它的可能有人可以給你一個關於如何使這個阻塞,同步呼叫的答案。如果是這樣,並且如果你實施它,那麼你做錯了。你也可以使用像Ruby或Python這樣的多線程腳本語言。

寫回調並不是那麼糟糕,但它需要一些關於體系結構和包裝的想法,而這些方式對於不習慣風格的人可能並不熟悉。

+0

我來自PHP背景,可能爲什麼我很困惑。看起來我需要重新思考在使用NodeJS時如何構建應用程序。謝謝 – mikelbring

+0

nodeJS是一個不同的範例,不要嘗試像同步系統一樣對其進行編碼,回調是允許的運行速度與非運行速度一樣(非阻塞)。開始時比較困難,但比嘗試在C,Java或PHP等語言中實現異步代碼要容易得多 –

1

Node.js將Continuation Passing Style用於它的所有異步接口。圍繞這個和modules討論了很多,它們是爲了緩解嵌套回調的痛苦而創建的。有傳言說,node.js可能會開始在v0.7.x分支中重新引入Promise到它的核心,但我不確定這是否正確。

由於上面的鏈接使用了流控制庫之一(或者自己動手),你要麼必須使用嵌套的回調函數,要麼僅僅爲回調函數提供一個函數引用。例如,

var data = [], 
    handler = function(err, results, fields) { 
     if (err) { 
      throw err; 
     } 
     ... 
    }; 
client.query('SELECT * FROM cds', handler);