2016-08-12 10 views
4

the chrome.webstore.install(link, success, fail) functionを使用してGoogle Chrome拡張機能をインラインロードしようとしています。chrome.webstore.installは両方のコールバックを呼び出しますか?どうして?

ここに私のページの<head>スタンザ内のリンクがあります。

<link rel="chrome-webstore-item" 
    href="https://chrome.google.com/webstore/detail/oafp--redacted--ffencd" /> 

ここにボタンがあります。ここで

<input type="button" class="btn btn-default" onclick="getExtension();">Go</input> 

は、右閉じ</body>タグの前に表示されますJavascriptを、です。

<script type="text/javascript"> 

    function getExtension() { 

     function extensionFailed(reason) { 
     console.log("extension Install Failed:", reason); 
     } 

     function extensionInstalled() { 
     console.log("installed"); 
     }; 

     console.log("calling install"); 
     chrome.webstore.install(undefined, extensionInstalled(), extensionFailed()); 
     console.log("install returned"); 

    }; 

    </script> 

getExtensionを呼び出すボタンをクリックすると、すぐにこのイベントシーケンスが返されます。

  1. は(失敗コールバック中)
  2. (成功コールバックで) "インストール" "拡張インストール失敗、未定義"
  3. は、「返さをインストール
  4. (右chrome.webstore.install()への呼び出しの前に) "インストールを呼び出します"。 "

chrome.webstore.install()への呼び出しからの復帰後に)どこかの真ん中に、非同期的に、私はインライン設置ポップアップを取得し、それを受け入れます。

私は思った...

  1. 障害コールバックは唯一失敗した場合に呼び出される必要があります。
  2. 失敗の理由は、undefinedではなく、意味があるはずです。
  3. 成功コールバックは、ユーザーがインストールを承認するまで延期する必要があります。

私は何か間違っている必要があります。 ...

答えて

4

回答:このコード行で

chrome.webstore.install(undefined, extensionInstalled(), extensionFailed());

あなたが実際にextensionInstalled()extensionFailed()()を持つことで機能を実行しています。あなたがコールバックとしてそれらを渡したい場合は、実際のような機能で自分自身を渡すことができますでしょうvar

注:変数として

chrome.webstore.install(undefined, extensionInstalled, extensionFailed);


機能関数を呼び出す前に関数を定義するので、これはコードには当てはまりません。これは良い方法です。

変数を関数として定義することもできますが、IMOは物事をより混乱させるだけです。これらの2関数の定義、例を見てみましょう:

var myfunctionVar = function() { 
    console.log('hello, world'); 
} 

function myfunction() { 
    console.log('hello, world'); 
} 

あなたは、通常の方法(すなわちmyfunctionVar()myfunction())でこれらの関数を呼び出します。

これらの2つの定義の主な違いは、myfunctionVarは定義自体が実行された後にのみ利用可能になるということです。myfunctionはそれを定義する親関数のスコープですぐに利用可能です。(またはスクリプトファイルがある場合親機能はありません)。これは物をより複雑にするだけの「吊り上げ」によるものです。

この例では、割り当てする前にmyfunctionVar()に電話をかけることはできません。ただし、これはmyfunction()を呼び出す場合ではなく、親関数内のどこでも呼び出すことができます。

See this answer for a more information.

機能は、もう少し複雑である(と強力な!)JavaScriptで他の言語に比べて、うまくいけば、この答えはあなたのためにいくつかのことをクリア。 You can read about hoisting from W3Schools, here.

+2

正しい。 '()'は、 '.install(...)'メソッドが呼び出される前であっても、すぐに両方のコールバック関数を実行します。これらの括弧を削除することで、_reference_を関数としてパラメータとして渡すことができます。 もう少し詳しい情報を提供します。 'install'メソッドは'() 'をコールバック_references_の後ろに置いて、これらのコールバックの1つが呼び出される必要があるときにそれらの関数の1つを関数として実行します。これは成功コールバックが呼び出されたときに 'success();'を使って行われます。 –

+2

*(額を刺す)*ありがとう! –

関連する問題