5

私は単純な Meteor サブスクリプションを持っており、データのロード中にロード中のメッセージを表示します。しかし、購読に失敗した場合にエラーメッセージを表示する方法がわかりません。

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いますが、それを接着してプロパティを渡す方法がわかりません。

4

1 に答える 1

0

多くの調査の後、私はこれをうまく機能させることができました.それはあなたの質問に答えると思います.

私はMeteor 1.6を使用していますが、あなたの側で動作させるための情報が得られるはずです.

出版物/出版物について:

  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));
  }

UI コンポーネント:

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

ここから必要なことは、エラー プロップを取得し、必要に応じてコンポーネントをレンダリングすることだけです。

これはerrorprop の構造です ( からのonStopコールバックで受信subscribe):

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

[編集]

条件付きの理由はMeteor.subscribe()、自然な更新から得られる迷惑な無限ループを回避するためですwithTracker()。これにより、新しいサブスクリプション/パブリケーションからの新しいエラーなどが発生します。

于 2017-12-01T14:32:02.543 に答える