Javascript 为什么可以';回流中的同步动作是否也可用作保证?
在我的代码中,我大量使用该模式。下面是一个例子:Javascript 为什么可以';回流中的同步动作是否也可用作保证?,javascript,refluxjs,Javascript,Refluxjs,在我的代码中,我大量使用该模式。下面是一个例子: var actions = Reflux.createActions({connectToFacebook: {asyncResult: true}}); actions.connectToFacebook.listenAndPromise(function(){ var facebookOauthPromise = _doFacebookConnect(); // implementation elided return
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。然后按照预期触发
但是,我必须将{sync:true}
添加到操作的定义中,因为\u doFacebookConnect
的实现调用了window.open
,除非在与用户单击事件相同的调用堆栈上调用,否则将阻止该操作。默认情况下,在调度事件时,Reflection将使用。.nextTick
,因此它不再位于同一堆栈上
当我这样做时,操作仍然正常工作,弹出窗口阻止程序不再是一个问题。但是,我的外部promise.then
无法执行,因为actions.connectToFacebook()
的返回值现在是未定义的
,而不是我从列表和promise
返回的承诺
为什么反流突然停止传递返回的承诺,有什么方法可以优雅地解决这个问题吗?我刚刚找到了一种绕过它的方法,方法是重写action.trigger
,而不是使用action.listendPromise()
:
它似乎涵盖了分派connectToFacebook.completed
(因为this.promise()
调用和返回承诺(通过显式地这样做)
但是,我仍然不清楚为什么回流不会自动执行此操作。我只是找到了一种绕过它的方法,方法是重写action.trigger
,而不是使用action.listenAndPromise()
:
它似乎涵盖了分派connectToFacebook.completed
(因为this.promise()
调用和返回承诺(通过显式地这样做)
然而,我仍然不清楚为什么回流不能自动完成这项工作
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;
};