Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否有任何方法可以延迟执行JavaScript导出语句?_Javascript_Reactjs_Ecmascript 6_Redux_React Redux - Fatal编程技术网

是否有任何方法可以延迟执行JavaScript导出语句?

是否有任何方法可以延迟执行JavaScript导出语句?,javascript,reactjs,ecmascript-6,redux,react-redux,Javascript,Reactjs,Ecmascript 6,Redux,React Redux,我正在使用React和Redux构建一个工具。我正在使用whatwgfetch进行服务器端调用并获取一些数据。我有一个reducer,它将在成功获取数据后在回调中创建其存储。这是我的密码: import {createStore} from 'redux'; import 'whatwg-fetch'; let notificationCardList = [], initialState, store; const fetchData = () => { fetc

我正在使用React和Redux构建一个工具。我正在使用whatwgfetch进行服务器端调用并获取一些数据。我有一个reducer,它将在成功获取数据后在回调中创建其存储。这是我的密码:

import {createStore} from 'redux';
import 'whatwg-fetch';

let notificationCardList = [],
    initialState,
    store;

const fetchData = () => {
  fetch('http://localhost:6767/file/data.json')
    .then((response) => response.json())
    .then((responseData) => {
      notificationCardList = Object.keys(responseData).map(key => responseData[key]);
    })
    .then(initializeReducer);
}

const initializeReducer = () => {
  initialState = {
    notifCardsToBeDisplayed: notificationCardList,
    notifCardToBeDisplayed: null
  };

  function manipulateNotificationCards (state = initialState, action) {
    switch (action.type) {
      case 'OPEN_CARD':
        return Object.assign(state, {
          notifCardsToBeDisplayed: null,
          notifCardToBeDisplayed: action.card,
          notifCardsContainerPreviousState: action.notifCardsContainerCurrentState
        });
      case 'DISPLAY_CARD_LIST':
        return Object.assign(state, {
          notifCardsToBeDisplayed: action.cards,
          notifCardToBeDisplayed: null
        });
      default:
        return state;
    }
  }

  store = createStore(manipulateNotificationCards);
}

fetchData();  

export {store, notificationCardList};

但是由于存储是作为回调的一部分创建的,由于异步行为,export语句可能在createStore()语句之前执行,因此我实际上是在导出一个未定义的“存储”。我也考虑过将export语句放在回调中,但是再次强调,export语句只能放在顶层。我还尝试使用setTimeout(),但也不起作用。有什么方法可以在创建“存储”后导出它吗?

处理异步初始化的通常方案是使用模块构造函数,该函数获取所需的导出值,模块构造函数要么返回承诺,要么接受回调,异步导出值仅通过该机制可用。这是因为异步操作需要不确定的时间,因此调用方能够可靠地使用它的唯一方法是等待它通过某种承诺或回调可用

缓存的承诺是一种非常干净的方式。模块初始化存储将使用所需异步值解析的承诺。模块方法获取承诺,然后调用方对承诺使用
.then()
。如果模块尚未完成异步值的获取,则承诺将不会调用
.then()
处理程序,直到值准备就绪。如果该值已经可用,则将立即调用
.then()
处理程序。在这两种情况下,调用方都只是获取承诺,添加一个
.then()
处理程序,然后对
.then()
回调中的值进行操作


这里这些方法的一些示例:

处理异步初始化的常用方案是使用模块构造函数来获取所需的导出值,模块构造函数要么返回承诺,要么接受回调,异步导出值仅通过该机制可用。这是因为异步操作需要不确定的时间,因此调用方能够可靠地使用它的唯一方法是等待它通过某种承诺或回调可用

缓存的承诺是一种非常干净的方式。模块初始化存储将使用所需异步值解析的承诺。模块方法获取承诺,然后调用方对承诺使用
.then()
。如果模块尚未完成异步值的获取,则承诺将不会调用
.then()
处理程序,直到值准备就绪。如果该值已经可用,则将立即调用
.then()
处理程序。在这两种情况下,调用方都只是获取承诺,添加一个
.then()
处理程序,然后对
.then()
回调中的值进行操作


这些方法的一些示例如下:

问题是我不能将export语句放在回调中,因为JavaScript不允许这样做。因此,我的“存储”将始终在分配值之前导出。我的问题是,我是否能够以某种方式延迟执行export语句,以便为执行回调提供时间。@RajarshiChakrabarti-我没有说要将导出放入回调中。我说的是导出一个承诺或者导出一个接受回调的函数。不能延迟执行导出语句。您必须重新构造代码,以便调用方等待值准备就绪。并且,您可以让调用者将回调传递到模块函数中,并在值准备就绪时调用该回调,或者让调用者获取一个承诺,即他们可以附加一个
。然后()
当值准备就绪时将调用的处理程序。@RajarshiChakrabarti-此处示例:@coder-在此处就完全无关的问题寻求帮助是不合适的。在堆栈溢出时,这并不酷。@jfriend00:对此我真的很抱歉,我太困惑了,我无法思考我应该怎么做。任何建议都将不胜感激。问题是我不能将export语句放在回调中,因为JavaScript不允许这样做。因此,我的“存储”将始终在分配值之前导出。我的问题是,我是否能够以某种方式延迟执行export语句,以便为执行回调提供时间。@RajarshiChakrabarti-我没有说要将导出放入回调中。我说的是导出一个承诺或者导出一个接受回调的函数。不能延迟执行导出语句。您必须重新构造代码,以便调用方等待值准备就绪。并且,您可以让调用者将回调传递到模块函数中,并在值准备就绪时调用该回调,或者让调用者获取一个承诺,即他们可以附加一个
。然后()
当值准备就绪时将调用的处理程序。@RajarshiChakrabarti-此处示例:@coder-在此处就完全无关的问题寻求帮助是不合适的。在堆栈溢出时,这并不酷。@jfriend00:对此我真的很抱歉,我太困惑了,我无法思考我应该怎么做。如有任何建议,我们将不胜感激。