2012-09-10 94 views
0

我用咖啡腳本編寫node.js,它工作正常,我想知道的是如何在咖啡腳本中返回一個函數的值 ,這裏是我的代碼如何在咖啡腳本中返回一個函數的值

exports.find=-> 
    db.open((err, db)-> 
     unless err 
      db.createCollection('test', (err, collection)-> 
       unless err 
        collection.find().toArray((err, items)-> 
         unless err 
          //here how to return *items* 
          console.log(items) 
       ) 
     ) 
) 

回答

2

由於DB相關的操作都是異步的,你應該指定find常規的回調函數。

(旁註:。

你應該使用保護條款像return if err,而不是unless err它減少縮進級別,使代碼更容易閱讀

或者更好的是,你應該通過錯誤的回調作爲第一個參數,這是node.js的項目約定)

exports.find = (callback) -> 
    db.open (err, db) -> 
    return callback(err) if err 
    db.createCollection 'test', (err, collection) -> 
     return callback(err) if err 
     collection.find().toArray (err, items) -> 
     return callback(err) if err 
     callback(null, items) // <<<================ 
+0

巧,如何在另一個模塊中使用這種方法嗎? '分貝=要求( './分貝'); items = db.find(???)' – Mil0R3

+0

@Veelian就像你在示例代碼中使用'db.open'一樣。 'db.find(err,items) - > doSomething(items)' – qiao

1

我會用流量控制等async這讓你有更乾淨的代碼和易於underst和異步流

npm install async 

async = require "async" 

exports.find = (callback) -> 
    async.waterfall [ 
    (callback) -> 
     db.open (err, db) -> callback err, db 

    (db, callback) -> 
     db.createCollection 'test', (err, collection) -> callback err, collection 

    (collection, callback) -> 
     collection.find().toArray (err, items) -> callback err, items 
    ], (err, items) -> 
    if err then callback null else callback items 

在這種情況下,發生錯誤時null將被退回。

如果沒有錯誤,items將返回