2015-01-02 3 views
1

В моем приложении Fluxxor изнутри хэша действий я проксировал аякс-вызовы для анализа результатов. Я хотел бы иметь возможность отправлять ответные нагрузки из этого модуля. Я сказал, что я могу сделать это, просто передавая экземпляр потока, а затем я могу послать так:передать экземпляр потока (fluxxor) из хэша действий к прокси-объекту

flux.dispatcher.dispatch({type: SomeActionType, payload: somePayload}); 

мой actions.js файл:

/** 
*actions.js 
*/ 

var api = require('./api'); 
var constants = require('./constants'); 

actions = { 
    someAction() { 
    /// I want to dispatch some messages from inside the api module 
    api.get('hello'); 
    // instead of doing it here 
    this.dispatch(SomeActionType, somePayload); 

    } 
} 

module.exports = actions; 

Я не уверен, как пройти экземпляр потока в модуль api, не передавая его в метод вызова get, при каждом запросе, который не кажется правильным.

Как получить экземпляр потока в модуль api?

UPDATE:

Я просто понял, что я имею LIB потока в node_modules. Могу ли я просто потребовать поток в моем модуле api?

var flux = require('flux') 

затем у меня есть доступ к Dispatcher.dispatch .. ИЛИ это нарушает дух fluxxor?

ответ

1

Общая идиома заключается в том, чтобы делать запросы в стороннем модуле, но отправлять действия в создателях действия. Таким образом, ваш веб-API (который делает запросы Ajax) и уведомления, специфичные для магазина (используемые флюсом), полностью разделены и легче тестируются.

actions = { 
    someAction() { 
    api.get('hello') 
    .then((resp) => { 
     // success case 
     this.dispatch(SomeActionType, somePayload); 
    }, (err) => { 
     // failure case 
     this.dispatch(SomeActionType, somePayload); 
    }); 

    } 
} 

api = { 
    get(param) { 
    return whateverAjax(param); 
    } 
} 

Однако, если вы действительно хотите, чтобы стрелять действия с API, вы можете создать и провод своей зависимость в порядке, а затем передать их вокруг. (Это также помогает тестирование, потому что вы можете передать в фиктивных экземпляров в ваших тестах.)

// api.js 

module.exports = (flux) => { 
    return { 
    get(param) { 
     whateverAjax(param).then((resp) => flux.dispatcher.dispatch(...)); 
    } 
    } 
} 

// actions.js 

module.exports = (api) => { 
    someAction() { 
    api.get('hello'); 
    } 
} 

// whever you init your Fluxxor.Flux object... 

var api = require("./api"); 
var actions = require("./actions"); 

var flux = new Fluxxor.Flux(stores); // no actions to start 

api = api(flux); 
actions = actions(api); 

flux.addActions(actions); 

Еще одно примечание: flux библиотека вы упоминаете в конце вашего вопроса Facebook's Flux library, и не имеет ничего делать с Fluxxor.

+0

Спасибо @Brandon ... С тех пор я переписал свою архитектуру в соответствии с вашим первым предложением о разделении проблем, но то, как вы инициируете объект Fluxxor.Flux выше, было тем, что я искал в то время. это хорошо знать. –

Смежные вопросы