【问题标题】:Sammy.js routing: How to wait for a library to be loaded before routingSammy.js 路由:如何在路由之前等待库加载
【发布时间】:2015-09-20 17:18:35
【问题描述】:

我目前正在构建一个基于 Google Cloud Endpoints (REST Api) 的单页应用程序,该应用程序使用 Sammy.js 进行路由。

简介

为了能够使用 Endpoints,我需要通过在 HTML 页面末尾添加以下脚本标记来加载 Google javascript 库:

<script src="https://apis.google.com/js/client.js?onload=init"></script>

并且在“init”回调函数中,我必须加载我的端点。详情请见https://cloud.google.com/appengine/docs/java/endpoints/consume_js

我有一个 Sammy 路线,它显示来自端点的项目列表,通过:

this.get('#/listAllItems', function () {
   listItems();  // function which calls the Endpoint and displays the results
});

问题

当我从页面中的按钮(或菜单项)调用此路由时,没有问题,因为 Google javascript 库以及 Endpoint 已经加载。

但是,当我直接通过浏览器的地址栏调用此路由时,我收到 500 错误,因为在触发路由之前 javascript 库没有时间加载。

body 500 Error get /page.html#/listAllItems gapi.client is undefined

我找到了一个解决方案,方法是在使用下面的代码调用端点之前等待加载库(和端点)。但我觉得这不是很优雅,可能有一些更好/更有效的方法来处理这个问题。

this.get('#/listAllItems', function () {
  function checkGapi() {
    if ((gapi.client) && (gapi.client.myEndpointApi)) {
      listItems();
    } else {
      window.setTimeout(checkGapi, 50);
    }
  }
  checkGapi();
});

非常欢迎任何建议,在此先感谢!

【问题讨论】:

    标签: javascript routing routes sammy.js


    【解决方案1】:

    在加载所有 api 时调用 Sammy.run() 应该可以解决问题。例如

    var app = Sammy(...);
    function init() {
       app.run();
    }
    

    【讨论】:

    • 感谢您的回答,它确实有效。要完整注意,必须将 Sammy.run() 作为端点加载的回调函数调用,例如: function init() { var ROOT = 'yourendpoint.appspot.com/_ah/api'; gapi.client.load('myEndpointApi', 'v1', function() { app.run(); }, ROOT); }
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-24
    • 1970-01-01
    • 1970-01-01
    • 2016-10-17
    • 2018-02-01
    • 1970-01-01
    相关资源
    最近更新 更多