chrome.webstore.install调用两个回调?为什么?

时间:2016-08-12 18:37:15

标签: javascript google-chrome google-chrome-extension

我正在尝试使用the chrome.webstore.install( link, success, fail) function内联加载Google Chrome扩展程序。

以下是我的网页<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>

这是Javascript,它出现在结束</body>标记之前。

 <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. “调用安装”(在致电chrome.webstore.install()之前)
  2. “已安装”(成功回拨)
  3. “扩展安装失败,未定义”(失败回调)
  4. “安装返回。” (从电话回复到chrome.webstore.install()后)
  5. 在中间的某个地方,异步,我得到内联安装弹出窗口并接受它。

    我以为......

    1. 故障回调只应在失败时调用。
    2. 失败的原因应该是有意义的,而不是undefined
    3. 应该推迟成功回调,直到用户接受安装。
    4. 我一定是做错了。 ......

1 个答案:

答案 0 :(得分:4)

<强>答案:

在这行代码中:

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

您实际上是通过()extensionInstalled()中的extensionFailed()来执行这些功能。如果你想将它们作为回调传递,你实际上可以像var一样传递函数:

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

作为变量的函数:

注意:这不适用于您的代码,因为您在调用它们之前定义了这些函数,这是一种很好的做法。

您还可以将变量定义为函数,IMO只会让事情变得更加混乱。例如,这两个函数定义:

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

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

您可以通常的方式调用这些函数(例如myfunctionVar()myfunction())。

这两个定义之间的主要区别在于myfunctionVar只有在定义本身执行后才可用,而myfunction在定义它的父函数范围内立即可用(或者一旦你的如果没有父函数,则执行脚本文件)。这是由于“吊装”,这只会使事情变得更加复杂。

在此示例中,您无法在分配myfunctionVar()之前调用它。但是,这不是调用myfunction()的情况,您可以在父函数中的任何位置调用它。

See this answer for a more information.

Javascript中的函数比其他语言中的函数更复杂(也更强大!),所以希望这个答案可以为您清除一些内容。 You can read about hoisting from W3Schools, here.