将闭包中的变量传递给导入的函数

时间:2017-03-26 17:44:12

标签: javascript

标题没有意义。但是我想不出更好的一个,所以请原谅我...... 考虑一下。

我试图将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));
}

1 个答案:

答案 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));
  }
}