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)
                )
        )
)
4

2 に答える 2

2

DB関連の操作はすべて非同期であるため、findルーチンのコールバック関数を指定する必要があります。

(サイドノート:

return if errの代わりにのようなguard句を使用する必要があり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) // <<<================ 
于 2012-09-10T06:39:03.580 に答える
1

asyncなどのフロー制御を使用すると、コードがよりクリーンになり、非同期フローが理解しやすくなります。

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返却されます

于 2012-09-10T06:39:45.350 に答える