从 gapi.client.load 中捕获错误

Eri*_*ton 6 javascript google-cloud-endpoints

我将 Google App Engine 与 Java 和 Google Cloud Endpoints 结合使用。在我的 JavaScript 前端,我使用此代码来处理初始化,建议

var apisToLoad = 2;
var url = '//' + $window.location.host + '/_ah/api';
gapi.client.load('sd', 'v1', handleLoad, url);
gapi.client.load('oauth2', 'v2', handleLoad);
function handleLoad() {
    // this only executes once,
    if (--apisToLoad === 0) {
        // so this is not executed
    }
}
Run Code Online (Sandbox Code Playgroud)

gapi.client.load失败时如何检测和处理?目前,我在 JavaScript 控制台上打印了一条错误消息,内容为:Could not fetch URL: https://webapis-discovery.appspot.com/_ah/api/static/proxy.html). 也许那是我的错,或者它是 Google 的一个临时问题——现在这不是我关心的问题。我正在尝试利用这个机会在客户端很好地处理此类错误。

那么 - 我该如何处理呢? handleLoad没有为 errs 调用执行,gapi.client.load似乎没有单独的错误回调(参见文档),它实际上并没有抛出错误(仅将其打印到控制台),并且它不返回任何内容。我错过了什么?到目前为止,我唯一的想法是设置超时并假设初始化在 X 秒后未完成时出现错误,但这显然不太理想。

编辑:

这个问题又出现了,这次是ERR_CONNECTION_TIMED_OUT在尝试加载oauth东西时的消息(这绝对是我无法控制的)。同样,我不是要修复错误,它只是确认值得优雅地检测和处理。

Wla*_*ant 2

不幸的是,文档在这里毫无用处,并且调试相关代码并不容易。显然所做gapi.client.load()的是为每个 API 插入一个<iframe>元素。然后,该框架提供必要的功能并允许通过postMessage(). 从表面上看,API 没有将load事件侦听器附加到该框架,而是依赖框架本身来指示它已准备好(这将导致回调被触发)。因此,缺少错误回调是一个固有的问题 - API 无法看到失败,因为没有帧来发出信号。

据我所知,您能做的最好的事情是将您自己的load事件侦听器附加到文档(事件将从框架中冒出)并在加载时检查自己。警告:虽然这可能适用于当前版本的 API,但不能保证在将来随着该 API 的实现发生变化而继续工作。目前这样的事情应该有效:

var framesToLoad = apisToLoad;
document.addEventListener("load", function(event)
{
  if (event.target.localName == "iframe")
  {
    framesToLoad--;
    if (framesToLoad == 0)
    {
      // Allow any outstanding synchronous actions to execute, just in case
      window.setTimeout(function()
      {
        if (apisToLoad > 0)
          alert("All frames are done but not all APIs loaded - error?");
      }, 0);
    }
  }
}, true);
Run Code Online (Sandbox Code Playgroud)

只是重复上面的警告:这段代码做了很多假设。虽然这些假设可能会在这个 API 中保持一段时间,但 Google 也可能会更改某些内容,并且此代码将停止工作。甚至可能 Google 根据浏览器使用不同的方法,我只在 Firefox 中进行了测试。