首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >为什么回流中的同步动作不能也用作承诺?

为什么回流中的同步动作不能也用作承诺?
EN

Stack Overflow用户
提问于 2015-08-07 05:17:40
回答 1查看 377关注 0票数 1

在我的代码中,我大量使用了async actions as promises模式。下面是一个例子:

代码语言:javascript
运行
复制
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返回的promise。

为什么回流突然停止通过返回的承诺,有任何方法可以优雅地解决这个问题吗?

EN

回答 1

Stack Overflow用户

发布于 2015-08-07 05:32:47

我只是找到了一种绕过它的方法,通过重写action.trigger而不是使用action.listenAndPromise()

代码语言:javascript
运行
复制
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不能自动完成这项工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31865970

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档