2012-04-20 10 views
2

Meteor.methodの定義では、コールバックを呼び出さずに結果を返す必要があることにちょっと驚きました。しかし、そうです!Meteor.methodから返される前にサブプロセスの結果を待つ方法

メイオールでRPCメソッドを作成しようとしています。メイオールのグループメソッドを呼びます(メテオのデータのようには見えませんでした。私はこのようなものがあります。仕事...私は私の流星クライアントからの呼び出しを取得しない上記掲載のコードの

Meteor.methods 
    getdata: -> 
    mongoose = __meteor_bootstrap__.require('mongoose') 
    db = mongoose.connect(__meteor_bootstrap__.mongo_url) 
    ASchema = new mongoose.Schema() 
    ASchema.add({key: String}) 
    AObject = mongoose.model('AObject',ASchema) 
    AObject.collection.group(
     ... 
     ... 
     (err,doc) -> # mongoose callback function 
     # I want to return some variation of 'doc' 
    ) 
    return ??? # I need to return 'doc' here. 

私自身の変化を、マングースは、すべてが自分の魔法をかけるオブジェクト。しかし、私の結果を元の文脈の中に戻す方法を理解することはできません。

どうすればいいですか?


私は自分のコードになるだろうといった答えは次のようになります。

require = __meteor_bootstrap__.require 
Meteor.methods 
    getdata: -> 
    mongoose = require('mongoose') 
    Future = require('fibers/future') 
    db = mongoose.connect(__meteor_bootstrap__.mongo_url) 
    ASchema = new mongoose.Schema() 
    ASchema.add({key: String}) 
    AObject = mongoose.model('AObject',ASchema) 
    group = Future.wrap(AObject.collection.group,6) 
    docs = group.call(AObject,collection, 
     ... 
     ... 
    ).wait() 
    return docs 

答えて

4

ああ...それを考え出しました。グーグルとグーグルで、 "そうしないでコールバックを使う!"という行に沿って過度の数のコメントを見つけたら、ついにそれを見つけました:fibers

私はfibers-promiseライブラリを使用して終了しました。これは内部的に使用されているものであるとして、あなたに流星のためのより良いAPIを与える可能性があり、繊維/将来のモジュールを使用して

Meteor.methods 
    getdata: -> 
    promise = __meteor_bootstrap__.require('fibers-promise') 
    mongoose = __meteor_bootstrap__.require('mongoose') 
    db = mongoose.connect(__meteor_bootstrap__.mongo_url) 
    ASchema = new mongoose.Schema() 
    ASchema.add({key: String}) 
    AObject = mongoose.model('AObject',ASchema) 
    mypromise = promise() 
    AObject.collection.group(
     ... 
     ... 
     (err,doc) -> # mongoose callback function 
     if err 
      mypromise.set new Meteor.Error(500, "my error") 
      return 
     ... 
     ... 
     mypromise.set mydesiredresults 
    ) 
    finalValue = mypromise.get() 
    if finalValue instanceof Meteor.Error 
     throw finalValue 
    return finalValue 
+1

あなた自身の回答を受け入れることができます。私はそれがここで正当化されると思います。あなたはしばらく待たなければなりません。 –

+0

申し訳ありませんが、私はそこで一気に興奮し、自分自身を助けることができませんでした。 – dsummersl

+0

私は不平を言っているわけではありません。私は、将来の調査者が同様の問題を解決しやすくするためにあなた自身の答えを受け入れることを提案しています。 –

0

、そしてそれがどのバニラ流星インストールに付属しています:私の最終的なコードは次のようになります。あなたの例を取るために

require = __meteor_bootstrap__.require 
Future = require 'fibers/future' 
mongoose = require 'mongoose' 

Meteor.methods 
    getdata: -> 
    db = mongoose.connect(__meteor_bootstrap__.mongo_url) 
    ASchema = new mongoose.Schema() 
    ASchema.add({key: String}) 
    AObject = mongoose.model('AObject',ASchema) 

    # wrap the method into a promise 
    group = Future.wrap(AObject.collection.group) 

    # .wait() will either throw an error or return the result 
    doc = group(... args without callback ...).wait() 
+0

それはより良く聞こえます、私はそれを試してみましょう。 (コールバックなしの...)。wait()、do()コールバックのないargs。doc = group.call(AObject.collection、...コールバックなしのargs)を試すと、 – dsummersl

+0

が呼び出されます。それでも同じ例外が出ますか? – olivoil

+0

Arg、走り回って申し訳ありません。そのため、最初に私が投稿したエラー(オブジェクト# ...)は、「AObject.find」コールをラップしようとしたときでした。私は少しの運(これと同じ種類の上記のエラー)でAObjectを渡そうとしました。それから私はポストで書いたようにAObject.collection.groupだけを試みました。それは私にこのエラーを与えます:関数は-1以上の引数を期待していません。私は引数としてAObject.collectionを入れて、同じ種類のエラーを取得しようとしました。 – dsummersl

2

例集でthis amazing gistをチェックしてください。

+0

これはどのようにこれが答えとして受け入れられなかったかです。 + 1'd – KJW

+0

[対象サイトに到達できない場合や、永久にオフラインになる場合に備えて、常に重要なリンクの最も関連する部分を引用します。](http://stackoverflow.com/help/how-to-answer) –

関連する問題