基础代码

在Adobe Experience Platform Web SDK异步加载时,基础代码通过排队命令启用引导过程。 基础代码运行后,您可以立即调用任何命令,如configure或sendEvent,而无需担心竞争条件或库完成加载时的时间。 当Web SDK完成加载时,排队的命令会以先进先出的顺序(与它们排队的顺序相同)执行。

命令会返回Promise,即使排队时也是如此。 如果命令已排入队列,则Promise将在Web SDK完成加载时运行该命令之后解析或拒绝。 如果Web SDK从未完成加载(例如,库加载失败),则已排队的Promise将保持挂起状态。

添加基础代码

将基础代码放在<head>标记中尽可能高的位置,放在可能调用Web SDK的任何脚本之前。

<script>
  !function(n,o){o.forEach(function(o){n[o]||((n.__alloyNS=n.__alloyNS||
  []).push(o),n[o]=function(){var u=arguments;return new Promise(
  function(i,l){n.setTimeout(function(){n[o].q.push([i,l,u])})})},n[o].q=[])})}
  (window,["alloy"]);
</script>

添加基础代码后,使用您选择的方法(JavaScript库加载器或Tags嵌入代码)加载Web SDK。 对于基于标记的实施,Web SDK标记扩展2.34.0及更高版本支持基础代码。

需要基础代码时

  • JavaScript库: 必需。 JavaScript库依赖于基础代码创建的实例和命令队列,因此基础代码必须在库加载之前运行。 此要求适用于<script>标记是异步标记还是同步标记,因为该要求与加载顺序有关,而不是与async属性有关。
  • 具有​createInstance()的​​ NPM包: 不需要。 当您导入库并直接调用createInstance()时,它将向您的代码返回一个实例函数,而与基础代码无关。
  • Web SDK标记扩展: 支持,但通常不需要。 标记扩展使用已存在的基代码(如果找到)。 仅当您的实施在标记库之外引用Web SDK时,才需要添加基础代码。 大多数标记实施仅在标记规则或操作中调用Web SDK,因此大多数不需要基础代码。

示例

请参阅此代码示例中的注释,了解如何排队和解析命令的时间。 此示例同时适用于JavaScript库和标记扩展:

<head>
  <script>
    // Calls made before the base code runs are not captured (alloy is not yet defined).
    // Always make sure that the base code runs before any attempt to call commands.
    // alloy("getLibraryInfo").then(console.log).catch(console.error);
  </script>

  <!-- Base code -->
  <script>
    !function(n,o){o.forEach(function(o){n[o]||((n.__alloyNS=n.__alloyNS||
    []).push(o),n[o]=function(){var u=arguments;return new Promise(
    function(i,l){n.setTimeout(function(){n[o].q.push([i,l,u])})})},n[o].q=[])})}
    (window,["alloy"]);
  </script>

  <!-- Queued command -->
  <script>
    alloy("getLibraryInfo").then(result => {
      console.log("Queued call resolved:", result);
    }).catch(console.error);
  </script>

  <!-- Load the Web SDK using the JavaScript loader -->
  <script src="https://cdn1.adoberesources.net/alloy/<VERSION>/alloy.min.js" async></script>
  <!-- or the tag extension -->
  <!-- <script src=".../launch-<ENV>.min.js" async></script> -->

  <!-- Another call (queued if the library is still loading; immediate if it is ready) -->
  <script>
    alloy("getLibraryInfo").then(result => {
      console.log("Immediate call resolved:", result);
    }).catch(console.error);
  </script>
</head>

重命名SDK实例

您可以通过修改基础代码的最后一行来重命名所调用的全局函数。 更改:

(window,["alloy"]);

收件人:

(window,["ingot"]);

此更改允许您使用ingot而不是alloy调用命令:

ingot("configure", {
  datastreamId: "ebebf826-a01f-4458-8cec-ef61de241c93",
  orgId: "ADB3LETTERSANDNUMBERS@AdobeOrg"
});

多个SDK实例

您可以选择使用基础代码在页面上配置多个SDK实例。 有关详细信息,请参阅使用多个Web SDK实例。

recommendation-more-help
experience-platform-help-collection