3

現在、mongoose3.1.1とasync0.1.22の両方を使用しています。しかし、Mongooseモデルインスタンスをその中に保存しようとすると、async.auto機能しなくなりました。

次の例を参照して、自分で試してください。

mongoose = require 'mongoose'
async = require 'async'
Schema = mongoose.Schema
ObjectId = Schema.ObjectId

mongoose.connect "mongodb://localhost:27017/async-test"

SmthSchema = new Schema
  data : type: String

mongoose.model 'Smth', SmthSchema
Smth = mongoose.model 'Smth'

test1 = (next) ->
  console.log '  test 1'
  smth = new Smth data: 'some data'

  async.auto
    first: (callback) ->
      smth.save callback
    second: ['first', (callback) ->
      console.log '  it works!'
      callback()]
    next

test2 = (next) ->
  console.log '  test 2'
  smth = new Smth data: 'some data'

  async.series [
    smth.save.bind smth
    (callback) ->
      console.log '  it works!'
      callback()
  ], next

test3 = (next) ->
  console.log '  test 3'
  context =
    save: (callback) -> callback null

  async.auto
    first: context.save.bind context
    second: ['first', (callback) ->
      console.log '  it works!'
      callback()]
    next

test4 = (next) ->
  console.log '  test 4'
  smth = new Smth data: 'some data'

  async.auto
    first: smth.save.bind smth
    second: ['first', (callback) ->
      console.log '  it works!'
      callback()]
    next

console.log 'running all tests'
async.series [test1, test2, test3, test4], (err) ->
  console.log err || 'all works!'

結果の出力:

running all tests
  test 1
  it works!
  test 2
  it works!
  test 3
  it works!
  test 4

smth.save.bind smth保存するオブジェクトに保存関数をバインドします。とではうまく機能しますがasync.seriesasync.parallelでは機能しませんasync.auto

async.autoオブジェクトをデータベースに保存しますが、コールバックが失われ、処理が停止します。しかし、なぜそれが起こるのか誰かが知っていますか?

最も奇妙なことは、内部で他のasync.autoものをバインドMongooseすることにも、他のコンテキストでsaveメソッドをバインドすることにも問題がなかったことです。

私はすでにコードを調べましasyncたが、何が悪いのかまだわかりません。今、私はそれについての問題をgithubに書くことを計画しています。

20.09.12を追加:save関数を関数に置き換えましたがvalidate、すべてうまく機能しました:

running all tests
  test 1
  it works!
  test 2
  it works!
  test 3
  it works!
  test 4
  it works!
all works!

saveしたがって、問題はマングース機能に深く関係しています。

async.autoMongooseメソッドで動作すると、どこかで壊れているように見えますsave。しかし、どこで、なぜか理解できません。

4

1 に答える 1

2

編集

考え出した: @dpatti のブランチを使用すると、機能します。@caolan はまだマージしていないと思います (6 か月ほど経っています)。私は Node.js フレームワークであるSailsで async を使用しているため、これを注意深く監視し、マージされた場合はここに投稿します。

解決

package.json で、非同期依存関係を次のように変更します。

"async": "git://github.com/dpatti/async.git#safe-auto"

次に、npm installを実行すると、準備完了です。


Sequelize の save() と組み合わせると、同じ問題が発生します。これは関数のコンテキストの問題だと思います。手始めに役立つことを願っています!

私は壊れる基本的な例に取り組んでおり、より多くの情報が得られたら報告します。実際に非同期の問題であると思われる場合は、github で問題を提起し、ここにリンクします。

私は生のjavascript(コーヒーなし)を使用して、非同期0.1.22(およびSequelize 1.5.0-beta-2、それが誰かを助ける場合)にもいます

于 2013-01-22T03:58:58.310 に答える