我的代碼 https://gist.github.com/ButuzGOL/707d1605f63eef55e4af通量Dispatch.dispatch(...):不能在調度中間
所以當我登入成功回調我想要重定向,
重定向致力於通過調度員派遣太。
而且我得到Dispatch.dispatch(...):不能派遣中間派遣。
中間是否有任何攻擊行爲?
我的代碼 https://gist.github.com/ButuzGOL/707d1605f63eef55e4af通量Dispatch.dispatch(...):不能在調度中間
所以當我登入成功回調我想要重定向,
重定向致力於通過調度員派遣太。
而且我得到Dispatch.dispatch(...):不能派遣中間派遣。
中間是否有任何攻擊行爲?
我沒有看到您發佈的要點在做什麼重定向。我只看到AUTH_SIGNIN和AUTH_SIGNIN_SUCCESS操作,而且看起來非常簡單。
但是,不,在調度過程中沒有任何破解行爲,這是設計。行動不應該是導致變化的事情。他們應該像一張報紙,通知外部世界變化的應用,然後應用程序迴應這個消息。商店本身會引起變化。行動只是通知他們。
如果您有此錯誤,那麼您需要備份並查看您如何處理原始操作。通常,您可以設置應用程序以響應原始操作,完成您需要執行的所有操作,並避免嘗試創建第二個操作。
你可以把它的「調度」下一個動作的工作直接調用它,而不是,這裏是一個示例代碼:
// instead of doing this
Dispatcher.dispatch(...);
// go like this
setTimeout(function() {
Dispatcher.dispatch(...);
}, 1);
這將導致被稱爲後走出目前的派遣你的下一個調度過程,並且不會發生錯誤。
如果您的調度代碼位於回調函數中,那麼也可以使用任何其他類型的異步操作(例如,在針對Ajax請求的響應中)。
我正在使用這種風格讓一些表單在這裏對通用數據做出響應,而且我沒有遇到任何問題,至少我使用它的方式。
低劣,但適合我 – 2015-09-24 17:33:09
uuughhh - setTimeout hacks是可怕的。更好地使用承諾 – 2015-11-05 13:40:14
@DanOsborne我不認爲承諾在這裏解決任何事情,因爲它們不會像'setTimeout'那樣自動結束當前的執行線程。如果我誤解了,你能舉個例子嗎?謝謝! – 2016-02-03 21:47:56
反跳是一個更好的解決方案:
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
}
}
});
這是不正確的方法來做到這一點,因爲當你正在debounce功能,你會得到不同的,所以刪除更改偵聽器將無法按預期工作,導致回調有不同的上下文 – Kamil 2016-04-07 06:51:19
@Kamil _.debounce(callback).cancel() ; – backslash112 2016-04-07 08:06:31
可以用戶「推遲」的調度選項。 在你的情況下,它會像:
Dispatcher.dispatch.defer(...);
調度員沒有延遲方法。 '未捕獲的TypeError:_dispatcher.dispatcher.dispatch.defer不是一個函數' – rosencreuz 2017-11-13 14:20:13
您可以檢查調度程序調度,如:
if(!MyDispatcher.isDispatching()) {
MyDispatcher.dispatch({...});
}
其實這是很常見的,例如組件A創建改變商店B的動作哪個組件C正在監聽,響應組件C需要從服務器獲取數據,這是一個動作,但調度器仍然在調度,所以它不能。對我來說這個解決方案對我來說感覺很不好(用setTimeout或類似方法來包裝獲取動作) – Esailija 2014-12-12 12:00:27
我想最好不要導致*開始*請求的調度(唯一的原因就是顯示加載spinners等無論如何,這實際上並不是真正的應用數據,而是組件狀態) – Esailija 2014-12-12 12:20:08
組件不應該決定何時取數據。這是視圖層中的應用程序邏輯。該邏輯屬於商店,可以觸發XHR,然後錯誤/成功回調會使用新數據創建操作。 – fisherwebdev 2014-12-13 00:00:02