2016-04-14 31 views
0

React ve Redux kullanarak bir araç yapıyorum. Bir sunucu tarafında arama yapmak ve bazı verileri almak için whatwg-get kullanıyorum. Veriler başarıyla alındıktan sonra mağazasının bir geri aramada oluşturulacağı bir redüktörüm var. Bazı gecikme ile JavaScript dışa aktarma ifadesini uygulayabilmemin bir yolu var mı?

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

Ama mağaza asenkron davranışları nedeniyle geri arama, bir parçası olarak oluşturulmaktadır beri, ihracat deyimi muhtemelen CreateStore() deyimi önce idam oluyor

, dolayısıyla ben etkili değilim: İşte benim kodudur tanımlanmamış bir 'mağaza' ihraç etmek. İhracat beyannamesini geri aramada da dahil etmeyi düşündüm ama yine de ihracat beyanları sadece en üst seviyede olabilir. Ben de setTimeout() kullanmayı denedim, ama bu da işe yaramadı. Oluşturulduktan sonra 'mağaza' ihraç etmenin herhangi bir yolu var mı?

cevap

3

Zaman uyumsuz başlatma işleminin olağan şeması, istenen dışa aktarılan değeri alan bir modül kurucu işlevi kullanmaktır ve bu modül kurucusu ya bir söz verir veya bir geri arama alır ve eşzamanlı olmayan dışa aktarılan değer yalnızca bu mekanizma aracılığıyla kullanılabilir. Bunun nedeni, async işleminin belirsiz bir süre almasıdır, bu yüzden bir arayanın güvenilir bir şekilde kullanabileceği tek yol, bir çeşit söz veya geri arama yoluyla kullanılabilir olmasını beklemektir.

Önbelleğe alınmış bir söz, bunu yapmanın çok temiz bir yoludur. Modül başlatma, istenen async değeriyle çözülecek bir sözü saklar. Bir modül yöntemi sözü getirir ve daha sonra arayan kişi bu söz için .then() kullanır. Modül henüz async değerini almadıysa, söz konusu değer, hazır olana kadar .then() işleyicisini aramayacaktır. Değer zaten mevcutsa, .then() işleyicisi derhal çağrılacaktır. Her iki durumda da, arayan kişi sadece söz verir, .then() işleyicisini ekler ve daha sonra .then() geri aramadaki değere etki eder. Burada bu yöntemlerin

Bazı örnekler: How to async require in nodejs

+0

sorun JavaScript buna izin vermez gibi ben bir geri aramasında ihracat deyimi yerleştirin olamaz olmasıdır. Bu yüzden 'mağaza' her zaman bir değer atanmadan önce dışa aktarılacaktır. Sorum şu ki, bir şekilde geri verme işleminin gerçekleştirileceği zamanı sağlamak için ihracat bildirimini bir gecikmeyle çalıştırabilir miyim. –

+0

@RajarshiChakrabarti - İhraca bir geri bildirimde bulunmamayı söylemedim. Bir söz vermeyi veya geri arama yapan bir işlevi vermeyi söyledim. İhracat beyannamesini gecikmeyle yapamazsınız. Kodunuzu yeniden yapılandırmanız gerekir, böylece arayan değerlerin hazır olmasını bekler. Ayrıca, arayanın bir modül işlevine bir geri bildirimi iletmesini sağlayabilirsiniz ve değer hazır olduğunda geri arama çağrılır ya da arayanın bir '.then()' işleyicisini ekleyebileceklerine dair bir söz vermeniz gerekir. Değer hazır olduğunda çağrılır. – jfriend00

+0

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