Javascript 在匿名函数回调中使用put

Javascript 在匿名函数回调中使用put,javascript,reactjs,redux,redux-saga,Javascript,Reactjs,Redux,Redux Saga,我正在我的React+Redux Saga应用程序中实现,但是我在一些回调中遇到了一些问题,我无法使用put(…)方法。在方法中使用console.log(…)等确实会显示,但我无法将置于应用程序的状态 在异步/生成器函数的一些实现上,我可能是错的,但我现在几乎被卡住了 我的代码用于说明什么不会触发: import { takeLatest } from 'redux-saga' import { call, put } from 'redux-saga/effects' // Pusher

我正在我的React+Redux Saga应用程序中实现,但是我在一些回调中遇到了一些问题,我无法使用
put(…)
方法。在方法中使用
console.log(…)
等确实会显示,但我无法
置于应用程序的状态

在异步/生成器函数的一些实现上,我可能是错的,但我现在几乎被卡住了

我的代码用于说明什么不会触发:

import { takeLatest } from 'redux-saga'
import { call, put } from 'redux-saga/effects'

// Pusher actions
export const pusherConnecting = () => {
    return {
        type: ActionTypes.PUSHER_CONNECTING
    }
};

export const pusherConnectSucceeded = (client) => {
    return {
        type: ActionTypes.PUSHER_CONNECT_SUCCEEDED,
        client: client
    }
};

const pusherConnectFailed = (exception) => {
    return {
        type: ActionTypes.PUSHER_CONNECT_FAILED,
        message: exception
    }
};

// Pusher Saga
function * connectPusher(action) {
    try {
        const pusher = yield call(Api.connectPusher, action.directory, function(subscription) {
            subscription.bind(PUSHER_BIND_RELOAD, function() {
                location.reload(true);
            });

            subscription.bind(PUSHER_BIND_REQUEST_DATA, function(data) {
                if (data) {
                    put(updateDirectory(data));
                } else {
                    put(requestDirectory(action.directory.id));
                }
            });
        });

        pusher.connection.bind('connected', function() {
            put(pusherConnectSucceeded(pusher));
        });

        yield put(pusherConnecting());

    } catch (e) {
        yield put(pusherConnectFailed(e));
    }
}

export default function * pusherSaga() {
    yield * takeLatest(ActionTypes.DIRECTORY_FETCH_SUCCEEDED, connectPusher);
}



// My Api.ConnectPusher
export function * connectPusher(directory, subscription) {
    var pusher = new Pusher(PUSHER_KEY, {
        encrypted: true
    });

    var channels = ["test1", "test2"  ];

    for (var i = 0; i < channels.length; i++) {
        // Take each channel and callback with the subscription
        yield subscription(pusher.subscribe(channels[i]));
    }

    return pusher;
}

Redux saga不允许在不使用关键字的情况下
put
。put创建了一个简单的json对象/效果,必须对其进行解释/执行,如果您不让步,它将不会被执行

此外,即使使用
yield put(…)
,如果在回调中执行此操作,也不会对其进行解释,因为Redux saga无法在其解释器中运行回调。它们将作为正常回调运行,不会发生任何事情

如果
subscription.bind
应该返回一个结果,则可以将该调用包装到一个函数中,该函数返回一个承诺,然后生成该承诺

如果
subscription.bind
应该返回一个结果流,您可能需要而不是创建一个。我想将来会有人发布一些东西,可以很容易地将可观测数据转换为Redux saga流

请注意,如果您不需要多次取消订阅/重新订阅,那么将此代码放到传奇之外可能会更简单,只需这样做即可

        subscription.bind(PUSHER_BIND_RELOAD, function() {
            location.reload(true);
        });

        subscription.bind(PUSHER_BIND_REQUEST_DATA, function(data) {
            if (data) {
                reduxStore.dispatch(updateDirectory(data));
            } else {
                reduxStore.dispatch((requestDirectory(action.directory.id));
            }
        });

“未命中”是什么意思?你还没到那条线?您如何使用调试器进行检查?这意味着我无法启动此方法。
put
方法不会在我的匿名方法回调中调用。也许是这样,但国家没有改变(这是我的问题)。为什么说“可能”?这似乎是一件非常重要的事情,要确定
put
是否达到了预期效果,还是达到了预期效果。我会使用一个调试器来跟踪到底发生了什么,或者(这是一个非常次要的选项)抛出一些
console.log
s。(但与使用
console.log
torch相比,使用调试器就像打开灯。)我的问题是,例如
put(pusher连接成功(pusher))方法不分派状态更改。显然,在匿名回调中调用
put(…)
是不可能的。不,
put
无法知道您是从匿名回调调用它的,即使有,匿名回调也没有什么特别之处。再说一次,你只需要调试这个。这就是我需要知道的。我会找出一个解决方案,并用一个解决方案更新我的答案。谢谢!你能提供一个简单的例子“如果subscription.bind应该返回一个结果,那么你可以将该调用包装成一个函数,该函数返回一个承诺,然后产生该承诺”?用我的解决方案更新了我的问题,你认为这足够好吗?我不知道Pusher API,所以我有点难以知道。你可以做
yield onConnect(推送器);屈服put(pusherConnected())
。第一个屈服点将阻塞,直到连接完成,第二个屈服点将调度事件。我不知道你在另一个成品中嵌入成品的语法是否有效,但我认为它也有效。但我发现我的版本更加明确和灵活
        subscription.bind(PUSHER_BIND_RELOAD, function() {
            location.reload(true);
        });

        subscription.bind(PUSHER_BIND_REQUEST_DATA, function(data) {
            if (data) {
                reduxStore.dispatch(updateDirectory(data));
            } else {
                reduxStore.dispatch((requestDirectory(action.directory.id));
            }
        });