在我的代码中,我大量使用了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
,除非在与用户单击事件相同的调用堆栈上调用,否则它将被阻塞。默认情况下,回流将在调度事件时使用_.nextTick
,因此它不再位于同一堆栈中。
当我这样做时,操作仍然正常工作,弹出窗口拦截器不再是问题。但是,我的外部promise.then
无法执行,因为actions.connectToFacebook()
的返回值现在是undefined
,而不是我从listenAndPromise
返回的promise。
为什么回流突然停止通过返回的承诺,有任何方法可以优雅地解决这个问题吗?
发布于 2015-08-07 05:32:47
我只是找到了一种绕过它的方法,通过重写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不能自动完成这项工作。
https://stackoverflow.com/questions/31865970
复制相似问题