【问题标题】:Why can't synchronous actions in Reflux also be used as promises?为什么 Reflux 中的同步操作也不能用作 Promise?
【发布时间】:2015-08-06 21:17:39
【问题描述】:

在我的代码中,我大量使用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 突然停止通过返回的承诺,有什么办法可以优雅地解决这个问题?

【问题讨论】:

    标签: javascript refluxjs


    【解决方案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 不自动执行此操作。

    【讨论】:

      猜你喜欢
      • 2016-02-12
      • 1970-01-01
      • 1970-01-01
      • 2017-02-06
      • 1970-01-01
      • 2014-11-27
      • 1970-01-01
      • 2016-01-16
      • 1970-01-01
      相关资源
      最近更新 更多