startSubscription никогда не вызывается в действии - PullRequest
0 голосов
/ 21 января 2019

Я пытаюсь использовать промежуточное программное обеспечение Meteor Redux.Следуя инструкциям, шаг за шагом, но пока не удалось заставить его работать.Проблема, похоже, заключается в startSubscription: я никогда не вижу вызываемых функций get () и subscribe (), я проскальзывал внутри консольных вызовов, которые пусты как в браузере, так и в серверном терминале.

// actions.js
import { Meteor } from 'meteor/meteor';
import { startSubscription } from 'meteor-redux-middlewares';
import FaucetRewards from '/imports/api/Rewards/Rewards.js';

export const HOME_REWARDS_SUBSCRIPTION_READY = 'HOME_REWARDS_SUBSCRIPTION_READY';
export const HOME_REWARDS_SUBSCRIPTION_CHANGED = 'HOME_REWARDS_SUBSCRIPTION_CHANGED';
export const HOME_REWARDS_SUB = 'rewards';

export const loadRewards = () =>{

  console.log("actions.loadRewards()"); // I can see this

  let sub = Meteor.subscribe(HOME_REWARDS_SUB); // I can see this in server console and in the sub variable below

  console.log(sub);

  console.log(FaucetRewards.find().fetch()); // Sub is not performed in time, so this is empty as expected

  return(
    startSubscription({
      key: HOME_REWARDS_SUB,
      get: () => { 
        console.log("loadRewards.startSubscription.get()"); // I can never see this
        return (FaucetRewards.find().fetch())
      },
      subscribe: () => {  
        console.log("loadRewards.startSubscription.subcribe()"); // I can never see this
        let subscription = Meteor.subscribe(HOME_REWARDS_SUB); 
        return subscription;
      }
    })
  );

};

Там может быть какая-то глупость, которую я пропускаю.Может кто-нибудь помочь мне, пожалуйста?

1 Ответ

0 голосов
/ 25 января 2019

Я наконец понял проблему.

Во-первых, у меня возникла проблема в файле store.js. В частности, я случайно удалил строки, связанные с createReactiveMiddlewares.

const {источники, подписки,} = createReactiveMiddlewares (трекер);

Затем, при реализации actions.js, вы должны быть очень осторожны с именами действий, а также с методом Meteor.subscribe, который должен называться в соответствии с действиями. Пример ниже, если HOME_POSTS_SUB равен «home_randomName», он не будет работать, потому что префиксы _SUBSCRIPTION_READY и _SUBSCRIPTION_CHANGED должны быть согласованы со строковым значением _SUB.

export const HOME_POSTS_SUBSCRIPTION_READY = 'HOME_POSTS_SUBSCRIPTION_READY'; экспорт конст HOME_POSTS_SUBSCRIPTION_CHANGED = 'HOME_POSTS_SUBSCRIPTION_CHANGED'; export const HOME_POSTS_SUB = 'home.posts'; // буду работать! // экспорт const HOME_POSTS_SUB = 'home.randomName'; // испортил !! // экспорт const HOME_POSTS_SUB = 'posts'; // испортил !!

export const loadHomePosts = () => startSubscription ({ ключ: HOME_POSTS_SUB, подписаться: () => Meteor.subscribe (HOME_POSTS_SUB), get: () => Posts.find (). fetch (),

присвоение имени HOME_POSTS _... иначе это доставит вам массу неприятностей потом. Таким образом, правильное именование действий будет иметь эффект позже, когда вы используйте их в файле reducer.js:

функция экспорта home (state = initialState, action) {switch (action.type) { case HOME_POSTS_SUBSCRIPTION_READY: вернуть { ...государство, готово: action.payload.ready, postsSubscriptionStopped: false, }; case HOME_POSTS_SUBSCRIPTION_CHANGED: вернуть { ...государство, сообщения: action.payload, }; case STOP_SUBSCRIPTION: return action.payload === HOME_POSTS_SUB ? {... state, postsSubscriptionStopped: true} : государство; дефолт: возвратное состояние; }}

...