1

私のコードでは、async アクションを promisesパターンとして頻繁に使用しています。次に例を示します。

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が期待どおりに起動されます。

ただし、ユーザー クリック イベントと同じコール スタックで呼び出されない限りブロックされるcalls{sync: true}の実装のため、アクションの定義に追加する必要がありました。イベントのディスパッチ時にデフォルトで Reflux が使用されるため、同じスタック上に存在しなくなります。_doFacebookConnectwindow.open_.nextTick

これを行うと、アクションは引き続き適切に機能し、ポップアップ ブロッカーはもはや問題ではありません。ただし、 の戻り値がから返された promise ではなく であるため、アウターpromise.thenは実行に失敗します。actions.connectToFacebook()undefinedlistenAndPromise

Reflux が返されたプロミスの通過を突然停止するのはなぜですか? これをエレガントに回避する方法はありますか?

4

1 に答える 1

0

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 がこれを自動的に行わない理由については、まだ明確ではありません。

于 2015-08-06T21:32:46.787 に答える