Tôi đang triển khai Pusher vào ứng dụng React + Redux Saga của mình, nhưng tôi gặp một số vấn đề với một số cuộc gọi lại nơi tôi không thể nhấn phương thức put(...)
. Sử dụng console.log(...)
v.v. trong các phương pháp hiển thị, nhưng tôi không thể put
đến trạng thái đơn đăng ký của mình.Sử dụng đặt bên trong gọi lại hàm ẩn danh
Tôi có thể sai về một số việc triển khai các chức năng không đồng bộ/máy phát, nhưng hiện tại tôi đang gặp nhiều khó khăn.
Mã của tôi để minh họa cho những gì sẽ không cháy:
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;
}
Giải pháp dựa trên @Sebastien
yield put(yield onConnect(pusher));
function onConnect(pusher) {
return new Promise((resolve, reject) => {
pusher.connection.bind('connected', function() {
resolve(pusherConnectSucceeded(pusher));
});
});
}
"Không được nhấn" nghĩa là gì? Bạn không đạt được dòng đó? Làm thế nào bạn kiểm tra, với một trình gỡ lỗi? –
Điều đó có nghĩa là tôi không thể kích hoạt phương pháp này. 'Put'method không được gọi trong lời gọi lại phương thức nặc danh của tôi. Hoặc có thể là vậy, nhưng tiểu bang không thay đổi (đó là câu hỏi của tôi). – janhartmann
Tại sao "có thể"? Có vẻ như đó sẽ là một điều cơ bản ** thực sự ** để xác định, cho dù 'đặt' không đạt được hay đạt được nhưng không có hiệu quả mong muốn. Tôi muốn sử dụng một trình gỡ lỗi để làm theo những gì, chính xác, xảy ra, hoặc (và điều này là ** rất nhiều ** một tùy chọn hạng hai) ném vào một số 'console.log' s. (Nhưng so với việc lang thang với ngọn đuốc 'console.log', sử dụng trình gỡ lỗi giống như bật đèn.) –