EDITAR Usé el término incorrecto en el título y la pregunta. No quise decir una variable global, sino declarar timeoutID dentro de la función showNotification.
Estoy en mi primera semana de pruebas Redux. Me pregunto si hay una solución más elegante/menos hacky para usar una variable glodal para el timeoutID. clearTimeout se utiliza para garantizar que la última notificación agregada siempre se muestre durante todo el tiempo deseado, incluso si se agregara antes de que la notificación anterior se configurara como "vacía".
actionCreator.js
import { addQuote } from "./addQuote" import { showNotification } from "./showNotification" export const actionCreator = (quote, time) => { return dispatch => { dispatch(addQuote(quote)) dispatch(showNotification(quote, time)) } }showNotification.js
let timeoutID = null export const showNotification = (newQuote, time) => { const message = `A new quote by ${newQuote.author} was added.` return dispatch => { dispatch({ type: 'SHOW_NOTIFICATION', data: message }) clearTimeout(timeoutID) timeoutID = setTimeout(() => { dispatch({ type: 'SHOW_NOTIFICATION', data: '' }) }, time * 1000) } }notificaciónReductor.js
const initState = { notification: '' } const notificationReducer = (state=initState, action) => { switch (action.type) { case 'SHOW_NOTIFICATION': const message = action.data return { ...state, notification: message } default: return { ...state } } } export default notificationReducerNo es global, es un cierre , y ese es uno de los principios básicos en un mundo de módulos (¡que se inventó para evitar tener que usar el espacio de nombres global!).
Si fuera global, podría usar la variable en cualquier otro archivo JS sin importarlo explícitamente.
En actionCreator.js , que import { showNotification } from "./showNotification" , intente con console.log(timeoutID) y obtendrá undefined .
Los cierres no son realmente nada complicados; simplemente significa que cualquier función, cuando se declare, "recordará" cualquier variable local que se conociera ("dentro del alcance" es el término técnicamente más correcto para "conocido") en el punto de la declaración de la función, sin importar cuándo se llame a la función, o quien lo llama . Aquellas variables conocidas por una función a través de este mecanismo se llaman cierres .
No solo no hay nada de malo en programar de esta manera; además, es lo último en tecnología y, en contraste con otras soluciones mucho más detalladas y largas, como pasar parámetros, es la forma más elegante de resolver el problema.