2016-04-15 10 views
5

私は単純なMeteorサブスクリプションを持っており、データがロードされている間にロードメッセージを表示します。しかし、私はサブスクリプションが失敗した場合にエラーメッセージを表示する方法を知らない。Meteor 1.3 + React:サブスクリプション障害を検出しますか?

export const MyAwesomeComponent = createContainer(() => { 
    let sub = Meteor.subscribe('some-data'); 
    if (!sub.ready()) return { message: 'Loading...'}; 
    if (sub.failed()) return { message: 'Failed.' }; // How to do this? 
    return { 
    data: Data.find().fetch() 
    } 
}, MyInternalRenderComponent); 

問題は、サブスクリプションオブジェクトはfailed()方法のみready()クエリを持っていない、です。 createContainer()メソッドでサブスクリプションの失敗をどのように小道具として渡すのですか?

私はMeteor.subscribeメソッドにはこの場合のコールバックがonStopであることを知っていますが、プロパティを渡すにはそれを接着する方法がわかりません。

+0

サブスクリプションに失敗した状態はなく、クライアントデータベースコピーのデータセットを提供するだけです。特定の条件が満たされている場合にのみ、データを提供したいと思います。そのような場合は、メソッドを作成するなどして、条件を個別にチェックします。 –

+0

これらは失敗した状態でなければなりません。出版物の名前を誤って入力した場合、そのような出版物はありませんか? – aedm

+0

その後、エラーオブジェクトとともに 'onStop'コールバックが呼び出されます。 –

答えて

0

私は多くの研究の後、私はこの作業をすることができたと私はあなたの質問に答えると思います。

私はMeteor 1.6を使用していますが、あなたの側で動作させるための情報を提供する必要があります。出版物で

/公開:UIコンポーネントに

try { 
    // get the data and add it to the publication 
    ... 
    self.ready(); 
    } catch (exception) { 
    logger.error(exception); 
    // send the exception to the client through the publication 
    this.error(new Meteor.Error('500', 'Error getting data from API', exception)); 
    } 

を:

const errorFromApi = new ReactiveVar(); 

export default withTracker(({ match }) => { 
    const companyId = match.params._id; 
    let subscription; 

    if (!errorFromApi.get()) { 
    subscription = Meteor.subscribe('company.view', companyId, { 
     onStop: function (e) { 
     errorFromApi.set(e); 
     } 
    }); 
    } else { 
    subscription = { 
     ready:() => { 
     return false; 
     } 
    }; 
    } 

    return { 
    loading: !subscription.ready(), 
    company: Companies.findOne(companyId), 
    error: errorFromApi.get() 
    }; 
})(CompanyView); 

ここからすべてを行う必要があるエラーの小道具を取得し、必要に応じてコンポーネントをレンダリングしています。

これは(subscribeからonStopコールバックで受信)errorプロプの構造である:

{ 
    error: String, 
    reason: String, 
    details: String 
} 

[編集]

Meteor.subscribe()周りの条件が存在する理由は回避することですあなたは自然なwithTracker()アップデートから得るだろう厄介な無限ループは、出版物の新しいサブスクリプション/新しいエラーの原因となります。

関連する問題