Почему синхронные действия в 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 не делает это автоматически.

Другие вопросы по тегам