1

在我的代码中,我大量使用异步操作作为 Promise模式。这是一个例子:

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

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 回答