2015-07-09 7 views
0

Я пытаюсь узнать, как работают действия и магазины Reflux, поэтому я написал небольшую тестовую программу. Когда я запускаю приложение, код, который вызываетКак я могу принудительно активировать действия рефлюкса в простой тестовой программе?

toggleGem(); 

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

Выход:

myObj=lastUpdate=undefined 
myObj=lastUpdate=undefined 
myObj=lastUpdate=undefined 
ENTER: gemStore.handleToggleGem: isGemActivated:false 
MyObj.onGemChange: newVal=true 
EXIT: gemStore.handleToggleGem: isGemActivated:true 
ENTER: gemStore.handleToggleGem: isGemActivated:true 
MyObj.onGemChange: newVal=false 
EXIT: gemStore.handleToggleGem: isGemActivated:false 

Обратите внимание, что выход консоли

ENTER: gemStore.handleToggleGem: isGemActivated:false 

не появится, пока программа не будет выхода. Это (для меня) означает, что события действия группируются и запускаются/запускаются позже некоторым «домашним заданием», которое делает Reflux.

Есть функция, которую я могу вызвать, чтобы сообщить Reflux, чтобы запустить события, которые были поставлены в очередь?

Чтобы воссоздать этот пример, просто сохранить код в RefluxTest.js и выполните следующие команды:

mkdir RefluxTest 
npm init 
npm install --save reflux 
npm install --save react 
node RefluxTest.js 

Спасибо.

ПРИМЕЧАНИЕ: Я знаю, что это не является показателем того, как Reflux обычно используется, потому что он находится вне браузера, но мне было любопытно, есть ли у кого-нибудь ответ.

на основе кода из http://spoike.ghost.io/deconstructing-reactjss-flux/

// Code for file RefluxTest.js 
// KWS: Learning how Reflux works outside of the browser 

var React = require("react/addons"); 
var TestUtils = React.addons.TestUtils; 
var Reflux = require("reflux"); 

// Creating action 
var toggleGem = Reflux.createAction(); 

// Creates a DataStore 
var gemStore = Reflux.createStore({ 

    // Initial setup 
    init: function() { 
     this.isGemActivated = false; 

     // Register statusUpdate action 
     this.listenTo(toggleGem, this.handleToggleGem); 
    }, 

    // Callback 
    handleToggleGem: function() { 
     console.log('ENTER: gemStore.handleToggleGem: isGemActivated:' + this.isGemActivated); 
     this.isGemActivated = !this.isGemActivated; 

     // Pass on to listeners through 
     // the DataStore.trigger function 
     this.trigger(this.isGemActivated); 
     console.log('EXIT: gemStore.handleToggleGem: isGemActivated:' + this.isGemActivated); 
    } 

}); 

function MyObj() { 
    gemStore.listen(this.onGemChange); 
    this.lastUpdate = undefined; 
} 

MyObj.prototype.toString = function() { 
    return "lastUpdate=" + this.lastUpdate; 
} 

MyObj.prototype.onGemChange = function(newVal){ 
    console.log("MyObj.onGemChange: newVal=" + newVal); 
    this.lastUpdate = newVal; 
} 

var myObj = new MyObj(); 
console.log("myObj=" + myObj); 

toggleGem(); 
console.log("myObj=" + myObj); 

toggleGem(); 
console.log("myObj=" + myObj); 
+0

ПРИМЕЧАНИЕ. Я создал пример этой программы на основе браузера, и происходит такое же поведение. RefluxAction не вызывается до тех пор, пока не исчезнут логические «основные». В случае браузера это означает, что вызовы Main.jsx ** React.render (

, document.getElementById («приложение»)) ** файл javascript завершается, а затем вызывается ReactActions. – PatS

ответ

0

Я начал отлаживать и шагнуть в код рефлюкса и сначала проверяет заявление, чтобы увидеть, если флаг «синхронизации» установлен, поэтому я попытался установить его, и работал!

Так, изменив код для добавления toggleGem.sync = True, как показано ниже

// Creating action 
var toggleGem = Reflux.createAction(); 
toggleGem.sync = true;     // THIS LINE WAS ADDED 

Демонстрационная программа работает, как ожидалось.

ПРИМЕЧАНИЕ. После того, как проблема синхронизации была первоначально задана, я также заметил ошибку/проблему, связанную с Javascript «this». Ниже приводится дополнительное изменение требуется:

function MyObj() { 
    gemStore.listen(this.onGemChange, this); 
    this.lastUpdate = undefined; 
} 

Если этот не был принят в gemStore.listen вызова , то код не будет работать должным образом.