Javascript React Native Redux防止操作在2分钟内重复两次

Javascript React Native Redux防止操作在2分钟内重复两次,javascript,reactjs,react-native,redux,react-redux,Javascript,Reactjs,React Native,Redux,React Redux,我正在开发一个React Native Redux应用程序,遇到了一个问题,我正在努力找出最干净、最有效的解决方案 我有一个减速器,它可以管理这样的模态: import { OPEN_CHORDS_MODAL, CLOSE_CHORDS_MODAL } from '../actions/types'; const INITIAL_STATE = { chordsModalIsOpen: false }; export default (state = INITIAL_STATE,

我正在开发一个React Native Redux应用程序,遇到了一个问题,我正在努力找出最干净、最有效的解决方案

我有一个减速器,它可以管理这样的模态:

import {
  OPEN_CHORDS_MODAL,
  CLOSE_CHORDS_MODAL
} from '../actions/types';

const INITIAL_STATE = {
  chordsModalIsOpen: false
};

export default (state = INITIAL_STATE, action) => {
  switch (action.type) {
    case OPEN_CHORDS_MODAL:
      return { chordsModalIsOpen: action.payload };
    case CLOSE_CHORDS_MODAL:
      return { chordsModalIsOpen: action.payload };
    default:
      return state;
  }
};
export class ModalContainer extends Component {
  state = {
    blockAds: false,
  };

  enableAds() {
    setTimeout(
      () =>
        this.setState({
          blockAds: false,
        }),
      , 120000
    );
  }

  displayFacebookAds = () => {
    if(!this.state.blockAds) {
      *Your code to dispatch FacebookAd action*
      this.setState({ blockAds: true });
      this.enableAds();
    }
  }
}
然后我在这里有我对模态的操作:

import { FacebookAds } from 'expo';

import {
  OPEN_CHORDS_MODAL,
  CLOSE_CHORDS_MODAL
} from './types';

export const openChordsModal = () => ({
  type: OPEN_CHORDS_MODAL,
  payload: true
});

export const closeChordsModal = () => {
  FacebookAds.InterstitialAdManager.showAd('328225604270934_328677554225739')
    .then(console.log('Intestitial Ad shown'))
    .catch(err => console.log('Interstitial Ad Error', err));
  return { type: CLOSE_CHORDS_MODAL, payload: false };
};
基本上,我正在查看
CloseChordModel
操作

我目前有一个插页广告,每次模式关闭时都会显示。这很好,但我想通过限制间隙广告弹出的次数来改善用户体验

我想确保一旦广告第一次出现,至少在接下来的2分钟内不会再次出现

const doNotShowAnythingUntil = new Date(new Date().getTime() + 2*60*1000);
i、 e.用户打开和关闭模式,广告出现(当前发生的情况)。然后,用户再次打开和关闭模态,如果上次关闭模态操作后的2分钟内,只需关闭模态,否则关闭模态并显示间隙广告


我怎样才能做到这一点?非常感谢

由于解决方案涉及到等待2分钟,我们不能在减速器中这样做,因为减速器必须是纯的,没有副作用或外部依赖性(是的,时间是外部依赖性)

在您的操作中,每次调用
CloseChordModel
都会将当前时间+2分钟保存下来

const doNotShowAnythingUntil = new Date(new Date().getTime() + 2*60*1000);
然后,每次你再次调用该操作时,你都会检查它

if( new Date() < doNotShowAnythingUntil ) { do nothing }

由于解决方案涉及到等待2分钟的
Date
,我们不能在reducer中这样做,因为reducer必须是纯的,没有副作用或外部依赖性(是的,时间是外部依赖性)

在您的操作中,每次调用
CloseChordModel
都会将当前时间+2分钟保存下来

const doNotShowAnythingUntil = new Date(new Date().getTime() + 2*60*1000);
然后,每次你再次调用该操作时,你都会检查它

if( new Date() < doNotShowAnythingUntil ) { do nothing }
对浏览器计时器作出反应。也许你可以试试这样的东西:

import {
  OPEN_CHORDS_MODAL,
  CLOSE_CHORDS_MODAL
} from '../actions/types';

const INITIAL_STATE = {
  chordsModalIsOpen: false
};

export default (state = INITIAL_STATE, action) => {
  switch (action.type) {
    case OPEN_CHORDS_MODAL:
      return { chordsModalIsOpen: action.payload };
    case CLOSE_CHORDS_MODAL:
      return { chordsModalIsOpen: action.payload };
    default:
      return state;
  }
};
export class ModalContainer extends Component {
  state = {
    blockAds: false,
  };

  enableAds() {
    setTimeout(
      () =>
        this.setState({
          blockAds: false,
        }),
      , 120000
    );
  }

  displayFacebookAds = () => {
    if(!this.state.blockAds) {
      *Your code to dispatch FacebookAd action*
      this.setState({ blockAds: true });
      this.enableAds();
    }
  }
}
对浏览器计时器作出反应。也许你可以试试这样的东西:

import {
  OPEN_CHORDS_MODAL,
  CLOSE_CHORDS_MODAL
} from '../actions/types';

const INITIAL_STATE = {
  chordsModalIsOpen: false
};

export default (state = INITIAL_STATE, action) => {
  switch (action.type) {
    case OPEN_CHORDS_MODAL:
      return { chordsModalIsOpen: action.payload };
    case CLOSE_CHORDS_MODAL:
      return { chordsModalIsOpen: action.payload };
    default:
      return state;
  }
};
export class ModalContainer extends Component {
  state = {
    blockAds: false,
  };

  enableAds() {
    setTimeout(
      () =>
        this.setState({
          blockAds: false,
        }),
      , 120000
    );
  }

  displayFacebookAds = () => {
    if(!this.state.blockAds) {
      *Your code to dispatch FacebookAd action*
      this.setState({ blockAds: true });
      this.enableAds();
    }
  }
}

酷,我明白你的意思,但我如何在我的
CloseChordModel
操作中实现这一点?因为我需要它第一次真正显示出来。谢谢@maxgallo:)酷,我理解你的意思,但是我如何在我的
closechordmodel
操作中实现它?因为我需要它第一次真正展示出来。谢谢@maxgallo:)