Javascript React Native Redux防止操作在2分钟内重复两次
我正在开发一个React Native Redux应用程序,遇到了一个问题,我正在努力找出最干净、最有效的解决方案 我有一个减速器,它可以管理这样的模态: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,
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:)