2013-04-03 75 views

回答

3

將呼叫同步的唯一方法是窩在它們回調:

function init() { 
    pg.connect('tcp://[email protected]/db', function(err, client, done) { 
    client.query("SELECT column FROM table", function(err, result) { 
     // check some things... 
     client.query("SELECT column FROM other_table", function(err, result) { 
     // check some other things... 
     main(); // proceed with flow... 
     } 
    }); 
    } 
} 

function main() { 
    // main logic 
} 

這可以是一個痛苦,並會在一些其他語言的小事,但它是野獸的本質。

+0

很好的評論:但它是野獸的本性......懷疑這是一隻野獸,雖然:) – luigi7up

+0

所以沒有辦法重用代碼?即有一個函數可以進行pg查詢並返回結果,因此我可以從不同的地方調用該函數。這可能嗎?謝謝 –

+0

是的......這是迄今爲止我寫過的最醜陋的Postgres代碼。但+1正確的答案。 – sudo

1

鑑於通話本質上是異步的,您將需要通過回調(事實上的節點樣式),異步或通過承諾來管理它(Q,when.js,藍鳥等)...)請注意,對於接受的答案,回調是而不是這是唯一的方法。

0

brianc(節點的Postgres的作者)commented here,即

「做同步查詢的唯一方法就是使用pg-native並使用sync變種的 方法。使用純JavaScript客戶端是不可能做同步 查詢,因爲節點如何工作。「

希望這有助於...

0

您可以通過組合使用pg-poolasyncawait做到這一點:

var suspendable = async (function defn(a, b) { 
var name1 = await(pool.query('select $1::text as name', ['foo'])); 
console.log(name1.rows[0].name, 'says hello'); 
var name2 = await(pool.query('select $1::text as name', ['bar'])); 
console.log(name2.rows[0].name, 'says hello'); 
}); 

suspendable();