Почему синхронные действия в Reflux также нельзя использовать как обещания?
В моем коде я активно использую асинхронные действия как шаблон обещаний. Вот пример:
var actions = Reflux.createActions({connectToFacebook: {asyncResult: true}});
actions.connectToFacebook.listenAndPromise(function(){
var facebookOauthPromise = _doFacebookConnect(); // implementation elided
return facebookOauthPromise.then(function(token){
return $.post('/api/facebook/connect', {token: token});
});
});
var promise = actions.connectToFacebook();
promise.then(function(){
// do something on success
});
Это прекрасно работает. Когда сначала oAuth, а затем запрос POST завершается, connectToFacebook.completed
и мой внешний promise.then
уволены, как и ожидалось.
Тем не менее, я должен был добавить {sync: true}
к определению действия, потому что реализация _doFacebookConnect
звонки window.open
, который будет заблокирован, если он не вызывается в том же стеке вызовов, что и событие щелчка пользователя. Рефлюкс по умолчанию будет использовать _.nextTick
при отправке события, чтобы оно больше не было в одном стеке.
Когда я делаю это, действие все еще работает должным образом, и блокировщик всплывающих окон больше не является проблемой. Тем не менее, мой внешний promise.then
не в состоянии выполнить, потому что возвращаемое значение actions.connectToFacebook()
сейчас undefined
вместо обещания, из которого я вернулся listenAndPromise
,
Почему Reflux внезапно перестает проходить через возвращенное обещание, и есть ли способ элегантно обойти это?
1 ответ
Я просто нашел способ взломать его, переопределив action.trigger
вместо того, чтобы использовать action.listenAndPromise()
:
actions.connectToFacebook.trigger = function(){
var facebookOauthPromise = _doFacebookConnect(); // implementation elided
var promise = facebookOauthPromise.then(function(token){
return $.post('/api/facebook/connect', {token: token});
});
this.promise(promise);
return promise;
};
Это, кажется, охватывает как диспетчеризацию connectToFacebook.completed
(из-за this.promise()
позвонить и вернуть обещание (явно сделав это).
Тем не менее, я до сих пор не понимаю, почему Reflux не делает это автоматически.