Backbone.js 主干路由器:如何等待视图准备就绪?

Backbone.js 主干路由器:如何等待视图准备就绪?,backbone.js,backbone-views,backbone-events,Backbone.js,Backbone Views,Backbone Events,在使用主干组织的映射应用程序上,主视图显示地图上的路径。此视图需要在第一次加载时从服务器获取数据,这需要约500毫秒的时间 每个路径都有一个唯一的url,该url设置为routes/navigate 当用户单击此url的外部链接并到达应用程序时,地图视图无法立即显示路径;它需要先获取数据 我已经建立了一个相当复杂/复杂的过程来完成下面描述的工作,但我想知道是否有更好的/规范的方法来完成这项工作 到目前为止,我的解决方案如下: 一般来说 有一个名为dispatch的全局视图,它实际上不是一个视图,

在使用主干组织的映射应用程序上,主视图显示地图上的路径。此视图需要在第一次加载时从服务器获取数据,这需要约500毫秒的时间

每个路径都有一个唯一的url,该url设置为routes/navigate

当用户单击此url的外部链接并到达应用程序时,地图视图无法立即显示路径;它需要先获取数据

我已经建立了一个相当复杂/复杂的过程来完成下面描述的工作,但我想知道是否有更好的/规范的方法来完成这项工作

到目前为止,我的解决方案如下:

一般来说 有一个名为dispatch的全局视图,它实际上不是一个视图,但用于存储各种其他视图的状态 准备就绪后,映射视图将触发要分派的事件,以便知道映射已就绪mapIsReady 加载新url时 在一个新的url上,route对象立即更新模型,然后触发一个要分派的事件,本质上说是在可能的情况下更新路径 收到此消息后,dispatch使用setTimeout监视其存储的映射视图的状态 当地图视图准备就绪时,dispatch会触发模型上的更新事件,通知每个视图显示它 优势

它起作用了! 视图不直接调用彼此的方法,一切都是通过事件完成的 极限

dispatch视图实际上根本不是一个视图 事件链可能会有点复杂。。。并在将来进行调试 setTimeout感觉不对 编辑:或者我的问题是我想同步页面上的所有内容,但我不应该。页面上有三个视图以不同的方式呈现相同的信息,只有地图视图存在渲染需要数据的问题


因此,这是地图视图的问题,而不是每个人的问题,因此,正确的方法可能是让所有的调度业务在地图视图中发生,并让其他视图尽快完成它们的工作…?

创建单独的对象来管理跨多个视图的复杂逻辑并不坏。但没有必要让它成为一种观点。您可以使用普通JS对象作为某种控制器/中介

此外,我认为在这种情况下最好使用承诺。它们使控制应用程序中的异步逻辑变得更加容易,例如,您可以执行以下操作:

$.when(prepareMapView, loadPathData).done(showPathToView);
你可以这样使用:
如果你放一些代码,它会更清晰。你的地图视图正在从某个地方获取数据,好吗?是来自第三方吗?您正在调用该方法。可以通过模型来休息。。您可以对其使用成功和错误回调函数。因此,当map数据获取返回success时,您可以在success回调中处理它。或者,如果在错误回调中错误处理它,那么使用承诺也不是一个坏主意,除非mapView只需要准备一次,而它可能会显示许多路径——从url读取的路径,然后是用户输入之后的其他路径。因此,是的,对于url的第一个路径,我们可以在准备映射后将其链接,但在这种特定情况下,我们需要过滤掉通知映射视图进行渲染的常规同步事件。使用标志虽然有点不雅观,但却是一种更通用的方法。使用promise很容易解决mapView只需准备一次的限制。您应该缓存已创建的承诺,并从prepareMapView方法返回它。所以,第一次创建promise时,存储并返回它,然后进行异步准备,下一次只返回存储的promise resolved或not。
this.yourMapModel.fetch({
  success: function(model, response, options){
      //"your code after successful return from url"
  },error:function(model, response, options){
       //"your code after error"
});