私のコードでは、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 が使用されるため、同じスタック上に存在しなくなります。_doFacebookConnect
window.open
_.nextTick
これを行うと、アクションは引き続き適切に機能し、ポップアップ ブロッカーはもはや問題ではありません。ただし、 の戻り値がから返された promise ではなく であるため、アウターpromise.then
は実行に失敗します。actions.connectToFacebook()
undefined
listenAndPromise
Reflux が返されたプロミスの通過を突然停止するのはなぜですか? これをエレガントに回避する方法はありますか?