2017-03-26 4 views
1

タイトルは本当に意味をなさない。しかし、私はより良いものを考えることができないので、私を許してください... これを考慮してください。クロージャの変数をインポート関数に渡す

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

「handleFBResp」をリスナーとして追加する必要があります。 'dispatch'を渡すためには' bind 'をする必要があります。しかし、それは 'removeListener'が動作しないようにします –

+0

申し訳ありません、あなたは呼び出し元ではないことがわかりました。私は最初にコードの最後のビットを見逃していました。まだ基本的な解決策です。ちょっと待ってください、。 –

+1

@ barry-johnsonはちょうどそれを理解しました..ハハ、助けてくれてありがとう。あなたのコメントは実際に私に影響を与えました:D –

答えて

0

実際には、これを考え出しました。ここで私は私が最初のサンクとしてhandleFbRespを行い、

export function handleFbResp(dispatch) { 

    return function _handleFbResp(tabId, tabObj) { 
    chrome.tabs.onUpdated.removeListener(_handleFbResp); 
    chrome.tabs.remove(tabId); 
    } 
} 

は、その後、私は、リスナーを追加し、サンクを呼び出すモジュールにそれを抽出

を行うものです。

(action) => (dispatch, getState) => { 
    chrome.tabs.create({ 
    url: FB_OAUTH_URI 
    }, (tab) => { 
    chrome.tabs.onUpdated.addListener(handleFbResp(dispatch)); 
    } 
} 
+1

はい、とてもうまく動作し、きれいです。 –

+1

@ barry-johnsonええ、ありがとう。あなたはちょうど私を打って質問し、私はサンクを作ることができることを思い出させた! –

+0

目を新しくしてくれることを大変歓迎します。 –