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

Javascript 将闭包中的变量传递到导入的函数中,javascript,Javascript,这个标题没有什么意义。但是我想不出更好的了,所以请原谅我。。。 考虑这个问题。 我试图将handleFBResp的定义从回调移到它自己的模块中。但棘手的是,我需要使用dispatch,它只能从闭包中访问 我也不能使用bind技巧,因为它创建了一个新函数,removeListener也不能工作 到这里的合适方式是什么 (action) => (dispatch, getState) => { chrome.tabs.create({ url: FB_OAUTH_URI }, (ta

这个标题没有什么意义。但是我想不出更好的了,所以请原谅我。。。 考虑这个问题。

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

事实上,我知道了。我就是这么做的

我首先将
handlefresp
作为一个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));
  }
}

事实上,我知道了。我就是这么做的

我首先将
handlefresp
作为一个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));
  }
}

我需要添加
handlefresp
作为侦听器。为了通过
dispatch
In,我需要执行
bind
。但是那会使
removeListener
不工作,我现在知道你不是来电者了。起初,我错过了代码的最后一部分。这仍然是基本的解决办法。“等一下,”巴里·约翰逊刚想出来。。哈哈,谢谢你的帮助。您的评论实际上启发了我:DOh,现在我明白了您的
removeListener
为什么不能使用partial/bind来轻松排序。这有点毛茸茸的。我需要添加
handlefresp
作为侦听器。为了通过
dispatch
In,我需要执行
bind
。但是那会使
removeListener
不工作,我现在知道你不是来电者了。起初,我错过了代码的最后一部分。这仍然是基本的解决办法。“等一下,”巴里·约翰逊刚想出来。。哈哈,谢谢你的帮助。您的评论实际上启发了我:DOh,现在我明白了您的
removeListener
为什么不能使用partial/bind来轻松排序。这有点毛茸茸的。@barry johnson是的,非常感谢。你的问题刚打动了我,提醒我我可以发出砰的一声@巴里·约翰逊是的,非常感谢。你的问题刚打动了我,提醒我我可以发出砰的一声!