【问题标题】:Is there any way I can execute a JavaScript export statement with some delay?有什么方法可以延迟执行 JavaScript 导出语句吗?
【发布时间】:2016-04-14 06:26:53
【问题描述】:

我正在使用 React 和 Redux 构建一个工具。我正在使用 whatwg-fetch 进行服务器端调用并获取一些数据。而且我有一个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};

但是由于存储是作为回调的一部分创建的,由于异步行为,导出语句可能在 createStore() 语句之前执行,因此我有效地导出了一个未定义的“存储”。我也想过将 export 语句放在回调中,但话又说回来,export 语句只能放在顶层。我也尝试过使用 setTimeout(),但这也没有用。有什么方法可以在创建后导出“商店”?

【问题讨论】:

    标签: javascript reactjs ecmascript-6 redux react-redux


    【解决方案1】:

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

    缓存的 Promise 是一种非常干净的方式。模块初始化存储了一个承诺,该承诺将使用所需的异步值进行解析。模块方法获取承诺,然后调用者在承诺上使用.then()。如果模块还没有完成获取异步值,那么在值准备好之前,promise 不会调用.then() 处理程序。如果该值已经可用,则将立即调用 .then() 处理程序。在任何一种情况下,调用者都只是获取承诺,添加一个.then() 处理程序,然后对.then() 回调中的值进行操作。

    这里有这些方法的一些示例:How to async require in nodejs

    【讨论】:

    • 问题是我不能将导出语句放在回调中,因为 JavaScript 不允许这样做。所以我的“商店”总是在被赋值之前被导出。我的问题是我是否可以以某种方式延迟执行导出语句,以便为执行回调提供时间。
    • @RajarshiChakrabarti - 我没有说要将导出放在回调中。我说要导出一个承诺或导出一个接受回调的函数。您不能延迟执行导出语句。您必须重组代码,以便调用者等待值准备好。而且,您可以让调用者将回调传递给模块函数,并在值准备好时调用该回调,或者让调用者获取他们可以附加.then() 处理程序的承诺,当值已准备就绪。
    • @RajarshiChakrabarti - 示例:stackoverflow.com/questions/34962075/…
    • @coder - 在完全不相关的问题上在这里寻求帮助是不合适的。这在堆栈溢出时并不酷。
    • @jfriend00:我真的很抱歉,我很困惑,我想不出我该怎么办。任何建议也将不胜感激。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-11
    • 2011-04-23
    • 2019-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-25
    相关资源
    最近更新 更多