2014-10-27 16 views

回答

27

我沒有看到您發佈的要點在做什麼重定向。我只看到AUTH_SIGNIN和AUTH_SIGNIN_SUCCESS操作,而且看起來非常簡單。

但是,不,在調度過程中沒有任何破解行爲,這是設計。行動不應該是導致變化的事情。他們應該像一張報紙,通知外部世界變化的應用,然後應用程序迴應這個消息。商店本身會引起變化。行動只是通知他們。

如果您有此錯誤,那麼您需要備份並查看您如何處理原始操作。通常,您可以設置應用程序以響應原始操作,完成您需要執行的所有操作,並避免嘗試創建第二個操作。

+17

其實這是很常見的,例如組件A創建改變商店B的動作哪個組件C正在監聽,響應組件C需要從服務器獲取數據,這是一個動作,但調度器仍然在調度,所以它不能。對我來說這個解決方案對我來說感覺很不好(用setTimeout或類似方法來包裝獲取動作) – Esailija 2014-12-12 12:00:27

+0

我想最好不要導致*開始*請求的調度(唯一的原因就是顯示加載spinners等無論如何,這實際上並不是真正的應用數據,而是組件狀態) – Esailija 2014-12-12 12:20:08

+3

組件不應該決定何時取數據。這是視圖層中的應用程序邏輯。該邏輯屬於商店,可以觸發XHR,然後錯誤/成功回調會使用新數據創建操作。 – fisherwebdev 2014-12-13 00:00:02

4

你可以把它的「調度」下一個動作的工作直接調用它,而不是,這裏是一個示例代碼:

// instead of doing this 
Dispatcher.dispatch(...); 

// go like this 
setTimeout(function() { 
    Dispatcher.dispatch(...); 
}, 1); 

這將導致被稱爲後走出目前的派遣你的下一個調度過程,並且不會發生錯誤。

如果您的調度代碼位於回調函數中,那麼也可以使用任何其他類型的異步操作(例如,在針對Ajax請求的響應中)。

我正在使用這種風格讓一些表單在這裏對通用數據做出響應,而且我沒有遇到任何問題,至少我使用它的方式。

+2

低劣,但適合我 – 2015-09-24 17:33:09

+2

uuughhh - setTimeout hacks是可怕的。更好地使用承諾 – 2015-11-05 13:40:14

+3

@DanOsborne我不認爲承諾在這裏解決任何事情,因爲它們不會像'setTimeout'那樣自動結束當前的執行線程。如果我誤解了,你能舉個例子嗎?謝謝! – 2016-02-03 21:47:56

0

反跳是一個更好的解決方案:

var _ = require('lodash'); 
var CHANGE_EVENT = "change"; 
var ApplicationStore = _.extend({}, EventEmitter.prototype, { 

    emitChange: function() { 
    this.emit(CHANGE_EVENT); 
    }, 

    addChangeListener: function(callback) { 
    this.on(CHANGE_EVENT, _.debounce(callback, 100)); 
    }, 

removeChangeListener: function(callback) { 
    this.removeListener(CHANGE_EVENT, callback); 
    }, 

    getState: function(){ 
    return { 
     showConsole: _showConsole 
    } 
    } 
}); 
+0

這是不正確的方法來做到這一點,因爲當你正在debounce功能,你會得到不同的,所以刪除更改偵聽器將無法按預期工作,導致回調有不同的上下文 – Kamil 2016-04-07 06:51:19

+0

@Kamil _.debounce(callback).cancel() ; – backslash112 2016-04-07 08:06:31

-1

可以用戶「推遲」的調度選項。 在你的情況下,它會像:

Dispatcher.dispatch.defer(...); 
+0

調度員沒有延遲方法。 '未捕獲的TypeError:_dispatcher.dispatcher.dispatch.defer不是一個函數' – rosencreuz 2017-11-13 14:20:13

0

您可以檢查調度程序調度,如:

if(!MyDispatcher.isDispatching()) { 
    MyDispatcher.dispatch({...}); 
}