2017-05-30 98 views
0

我正在使用Couchbase nodeJS SDK。爲了查詢我必須調用bucket.query("SELECT ...", function(err, rows){console.log("query's result received")})等待查詢結果

我想運行查詢順序,如:

  1. 運行查詢的結果的
  2. 工作
  3. 運行查詢B關於結果B
  4. 工作
  5. ...
  6. 在所有結果得到滿足並處理後繼續處理

甚至更​​好它可能是

  1. 運行由一個查詢
  2. 的結果一個工作,因爲他們正在收訖
  3. 繼續所有結果已收訖和處理

問題是我不知道如何等待所有查詢完成然後繼續。我承諾諾言,但我對nodeJS是新手,我不確定我是否正確使用了它們,也許有人可以指出我正確的方向?

我看到異步/等待功能在節點中可用,但我沒有設法使其工作。

任何幫助將是明顯的!


編輯

我試圖用couchbase-promises但我還是沒有得到我期望的行爲。這裏是我做了什麼:

console.log("start"); 
bucket.queryAsync(N1qlQuery.fromString('SELECT * FROM DATA_BUCKET WHERE type="BOOK"')) 
    .then(function(rows){console.log("success")}) 
    .catch(function(err){console.log(err)}) 
console.log("end"); 

但輸出顯示

start 
end 
success 

我想是

start 
success 
end 

我也試過const rows = await bucket.queryAsync("SELECT...)但我得到了一個Unexpected identifier錯誤。我發現在這個SO post,這意味着方法queryAsync沒有async關鍵字。

有關我如何實現預期行爲的任何想法? 謝謝!

回答

2

做到這一點的naivest方法是使用回調:

bucket.query('SELECT ...', function(err, rows) { 
 
    bucket.query('SELECT ...', function(error, moreRows) { 
 
    bucket.query('SELECT ...', function(...) { 
 
     // sent data to client or something 
 
    }) 
 
    }) 
 
})

但是,這會導致回調地獄,這需要避免,所以你應該更喜歡使用Promises

那裏已經存在一個從回調到承諾的couchbase端口:https://www.npmjs.com/package/couchbase-promises

這個轉換回調到這一點:

bucket.query('SELECT ....') 
    .then(successCallback) 
    .catch(errorCallback) 

之後,你甚至可以考慮async/await這將使你的代碼更易讀:

try { 
    const rows = await bucket.query(...) 
    // do other things 
catch (e) { 
    // handle errors 
} 
+0

你能檢查我的編輯?我嘗試了你提出的建議,但它看起來不像我期望的那樣工作。 – MHogge

+0

爲了使用'await',你的函數應該是'async',這就是爲什麼你有一個錯誤,你也需要節點7.6+,檢查我的答案中的鏈接 – notgiorgi

+0

我誤解了關於'async'的部分!我認爲被調用的函數應該是異步的,但它應該是調用函數。謝謝 ! – MHogge

1

Promise.all()允許您運行的承諾清單並等待所有履行(或第一次拒絕)。您必須使用couchbase-promises之類的東西,或者使用Bluebird或Q來提示您自己,因爲Couchbase SDK不會返回承諾。

將查詢返回爲承諾後,您可以將查詢堆疊到數組中,並將其傳遞到Promise.all()。這將返回一個新的承諾,用一系列結果來解決。

list = [ 
    bucket.query("SELECT ..."), 
    bucket.query("SELECT ..."), 
    bucket.query("SELECT ...") 
] 
Promise.all(list).then(function(results){ 
    // results is an array 
}).catch(function(err){ 
    // err is the first rejection encountered 
}) 

如果你想使用異步/等候在這裏,你可以做這樣的事情:

[r1, r2, r3] = await Promise.all(list) 
+0

>等待所有的履行(或第一次拒絕) 他們的方式是繼續錯誤而不是退出第一次拒絕? – MHogge

0

您可以使用異步瀑布庫最好庫連載一個由這裏一個 功能是鏈接water fall library它將開始執行從第一個功能,並將繼續到最後一個功能