为什么不能将Reflux中的同步操作用作承诺?

时间:2015-08-06 21:17:40

标签: javascript refluxjs

在我的代码中,我大量使用async actions as 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将按预期触发。

但是,我必须将{sync: true}添加到操作的定义中,因为_doFacebookConnect调用window.open的实现将被阻止,除非在用户调用相同的调用堆栈上调用点击事件。默认情况下,Reflux在调度事件时会使用_.nextTick,因此它不再位于同一堆栈中。

当我这样做时,操作仍然正常,弹出窗口阻止程序不再是问题。但是,我的外部promise.then无法执行,因为actions.connectToFacebook()的返回值现在是undefined,而不是我从listenAndPromise返回的承诺。

为什么Reflux突然停止通过返回的承诺,有没有办法优雅地解决这个问题?

1 个答案:

答案 0 :(得分: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()调用并返回promise(通过显式执行)。

但是,我还不清楚为什么Reflux不会自动执行此操作。