2016-04-14 6 views
0

Ich baue ein Werkzeug mit React und Redux. Ich verwende whatwg-fetch, um einen Server-Seitenaufruf zu machen und einige Daten zu holen. Und ich habe einen Reduzierer, dessen Speicher in einem Rückruf erstellt wird, nachdem die Daten erfolgreich abgerufen wurden. Hier ist mein Code:Gibt es eine Möglichkeit, eine JavaScript-Exportanweisung mit einiger Verzögerung auszuführen?

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}; 

Aber da der Speicher als Teil des Rückrufs erstellt werden, aufgrund asynchronen Verhalten der Export-Anweisung wahrscheinlich ausgeführt zu werden, bevor die creates() Aussage, daher bin ich effektiv einen undefinierten 'Store' exportieren. Ich habe darüber nachgedacht, die Export-Anweisung auch in den Callback zu stellen, aber Export-Statements können nur auf der obersten Ebene existieren. Ich habe auch versucht mit setTimeout(), aber das hat auch nicht funktioniert. Gibt es eine Möglichkeit, "Speicher" zu exportieren, nachdem es erstellt wurde?

Antwort

3

Das übliche Schema für die asynchrone Initialisierung besteht darin, eine Modulkonstruktorfunktion zu verwenden, die den gewünschten exportierten Wert erhält und der Modulkonstruktor entweder ein Versprechen zurückgibt oder einen Rückruf annimmt und der asynchrone exportierte Wert nur über diesen Mechanismus verfügbar ist. Dies liegt daran, dass die asynchrone Operation eine unbestimmte Zeit benötigt, so dass der Anrufer sie nur zuverlässig verwenden kann, indem er darauf wartet, dass er über eine Art Versprechen oder Rückruf verfügbar ist.

Ein Cache-Versprechen ist eine sehr saubere Möglichkeit, dies zu tun. Die Modulinitialisierung speichert ein Versprechen, das mit dem gewünschten asynchronen Wert aufgelöst wird. Eine Modulmethode ruft das Versprechen ab, und der Aufrufer verwendet dann für das Versprechen. Wenn das Modul den async-Wert noch nicht abgerufen hat, ruft das Versprechen den -Handler nicht auf, bis der Wert bereit ist. Wenn der Wert bereits verfügbar ist, wird der Handler .then() sofort aufgerufen. In jedem Fall ruft der Aufrufer nur das Versprechen ab, fügt einen -Handler hinzu und wirkt dann auf den Wert im Callback .

Einige Beispiele für diese Methoden hier: How to async require in nodejs

+0

Das Problem ist, dass ich nicht die Export-Anweisung in einem Rückruf platzieren können, wie JavaScript, dass nicht zulässt. So wird mein "Geschäft" immer exportiert, bevor ihm ein Wert zugewiesen wird. Meine Frage ist, ob ich die Export-Anweisung irgendwie mit einer Verzögerung ausführen kann, um Zeit für die Ausführung des Callbacks bereitzustellen. –

+0

@RajarshiChakrabarti - Ich habe nicht gesagt, den Export in einen Rückruf zu setzen. Ich sagte, ein Versprechen zu exportieren oder eine Funktion zu exportieren, die einen Rückruf annimmt. Sie können die Exportanweisung nicht mit einer Verzögerung ausführen. Sie müssen Ihren Code neu strukturieren, damit der Aufrufer auf den Wert wartet. Und Sie können entweder den Anrufer einen Callback in eine Modulfunktion übergeben lassen, und dieser Callback wird aufgerufen, wenn der Wert bereit ist, oder Sie haben den Aufrufer eine Zusage holen, dass sie einen '.then()' Handler an diesen anhängen können aufgerufen, wenn der Wert bereit ist. – jfriend00

+0

@RajarshiChakrabarti - Beispiele hier: http://stackoverflow.com/questions/34962075/how-to-async-require-in-nodejs/34962383#34962383 – jfriend00

Verwandte Themen