2016-04-28 2 views
1

Я читаю исходный код redux.Как понять наблюдаемую функцию в createStore

Кто-нибудь может помочь мне понять функцию в createStore здесь?

Кажется, что реализована другая версия шаблона наблюдателя.

вопросы:

я не найдено никаких кодов, называемых эту функцию, почему код появляется здесь. в чем цель? 2. как вызвать эту функцию с помощью магазина (ключ генерируется SYMBOLE ($$ наблюдаемом))

function observable() { 
var _ref; 

var outerSubscribe = subscribe; 
return _ref = { 
    /** 
    * The minimal observable subscription method. 
    * @param {Object} observer Any object that can be used as an observer. 
    * The observer object should have a `next` method. 
    * @returns {subscription} An object with an `unsubscribe` method that can 
    * be used to unsubscribe the observable from the store, and prevent further 
    * emission of values from the observable. 
    */ 

    subscribe: function subscribe(observer) { 
    if (typeof observer !== 'object') { 
     throw new TypeError('Expected the observer to be an object.'); 
    } 

    function observeState() { 
     if (observer.next) { 
     observer.next(getState()); 
     } 
    } 

    observeState(); 
    var unsubscribe = outerSubscribe(observeState); 
    return { unsubscribe: unsubscribe }; 
    } 
}, _ref[$$observable] = function() { 
    return this; 
}, _ref; 
} 

// When a store is created, an "INIT" action is dispatched so that every 
// reducer returns their initial state. This effectively populates 
// the initial state tree. 
dispatch({ type: ActionTypes.INIT }); 

return _ref2 = { 
dispatch: dispatch, 
subscribe: subscribe, 
getState: getState, 
replaceReducer: replaceReducer 
}, _ref2[$$observable] = observable, _ref2; 
} 

поддельный код:

нам нужно что-то вроде

var store$= store[$$observable]() 

, чтобы получить наблюдаемый. и любой желающий получать уведомление, если состояние изменено, необходимо сделать

магазин $ .subscribe (observer);

но сейчас. Я не могу получить в магазине [$$] наблюдаемую

ответ

1

после нескольких испытаний:

var x = window.Symbol.for('observable'); var y = store[x]; var z = y(); console.log(x); console.log(store[x]); console.log("y", y); console.log("z", z);

не делает контрольную точку, чтобы увидеть значение времени выполнения. иногда не определено. но вы можете использовать его на самом деле.

журнала:

Symbol(observable) 
main.tsx:138 observable() { 
var _ref; 

var outerSubscribe = subscribe; 
return _ref = { 
    /** 
    * The minimal observable subscription method. 
    * @param {Object} observer Any obje… 
main.tsx:139 y observable() { 
var _ref; 

var outerSubscribe = subscribe; 
return _ref = { 
    /** 
    * The minimal observable subscription method. 
    * @param {Object} observer Any obje… 
main.tsx:140 z Object {}subscribe: subscribe(observer)Symbol(observable):()__proto__: Object 
Смежные вопросы