标题没有意义。但是我想不出更好的一个,所以请原谅我...... 考虑一下。
我试图将handleFBResp
的定义从回调中移到自己的模块中。但棘手的是,我需要使用dispatch
,只能从闭包中访问。
我无法使用bind
技巧,因为它会创建一个新功能,而removeListener
则无效。
这里适当的方式是什么?
(action) => (dispatch, getState) => {
chrome.tabs.create({
url: FB_OAUTH_URI
}, (tab) => {
// I would like this function definition to be extracted
// into its own module, and import it.
function handleFBResp(tabId, tabObj, _) {
if (typeof tabObj.url !== 'undefined') {
let matchedCode = tabObj.url.match(/code=(.+)/);
if (matchedCode) {
chrome.tabs.onUpdated.removeListener(handleFBResp);
chrome.tabs.remove(tabId);
fbLogin(matchedCode[1]);
dispatch ...
}
}
}
chrome.tabs.onUpdated.addListener(handleFBResp);
// this below wouldn't work because bind creates a new function,
// and removeListener won't work
// chrome.tabs.onUpdated.addListener(handleFBResp.bind(null, dispatch));
}
答案 0 :(得分:0)
实际上,想出来了。这就是我的工作
我首先将handleFbResp
作为thunk,并将其提取到模块中
export function handleFbResp(dispatch) {
return function _handleFbResp(tabId, tabObj) {
chrome.tabs.onUpdated.removeListener(_handleFbResp);
chrome.tabs.remove(tabId);
}
}
然后我添加了监听器并调用了thunk。
(action) => (dispatch, getState) => {
chrome.tabs.create({
url: FB_OAUTH_URI
}, (tab) => {
chrome.tabs.onUpdated.addListener(handleFbResp(dispatch));
}
}