gpt4 book ai didi

javascript - 为什么 Reflux 中的同步操作不能也用作 Promise?

转载 作者:行者123 更新时间:2023-11-28 07:03:52 26 4
gpt4 key购买 nike

在我的代码中,我使用 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 在分派(dispatch)事件时将使用 _.nextTick,因此它不再位于同一堆栈上。

当我这样做时,该操作仍然可以正常工作,并且弹出窗口阻止程序不再是问题。但是,我的外部 promise.then 无法执行,因为 actions.connectToFacebook() 的返回值现在是 undefined 而不是我的 promise 从 listenAndPromise 返回。

为什么 Reflux 突然停止传递返回的 Promise,有什么方法可以优雅地解决这个问题吗?

最佳答案

我刚刚找到了一种方法来破解它,通过覆盖 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 不会自动执行此操作。

关于javascript - 为什么 Reflux 中的同步操作不能也用作 Promise?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31865970/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com