2013-07-12 30 views
1

当我的SPA初始化时,必须在加载任何视图之前进行一些需要运行的ajax调用。我已经将这些放在shell.js的activate函数中。在其他视图中,我从activate函数返回这些调用,并且所有工作都正常。但在shell中,我应该从router.activate调用返回。如何返回正确的视图,并确保这些ajax调用?我所看到的是数据并不总是加载。Durandal:如何在shell激活函数中正确创建ajax请求

activate: function() { 

      var query = 
      $.when(
        datacontext.getCurrentUser(), 
        datacontext.getGroupsAuthorized(), 
        datacontext.getTeams(), 
        datacontext.getRoles(), 
        datacontext.checkPermissions('views.shell') 
        ) 
      .then(function (s0, s1, s2,s3, s4) {  
       /* code excluded */   
      }, 
      function (f0, f1, f2) { 
       /* code excluded */ 

      }).always(function() { 
       /* code excluded */     
      }); 

      return router.activate('welcome'); 

    }, 

所有的datacontext通话是这个样子:

getCurrentUser = function() {   
     return $.ajax({ 
      url: 'api/currentuser/', 
      type: 'GET' 
     }); 
    }, 
+0

尽管您可以同时向客户端发送很多ajax请求,但我认为它的可扩展性不好。服务器上的会话可以一次访问一个请求,剩余的请求进入队列。当多个用户尝试启动此视图时,同时由于限制可伸缩性,您的服务器将因过多的排队请求而过载。还有一点需要记住的是,如果你对这些请求进行了authortizing/authenticating代码,每个请求都会一遍又一遍地执行,从而增加了正在执行的代码的复制。 – Yogesh

回答

3

请务必返回承诺,以便Durandal知道何时允许继续撰写作品。 沿线的一些事情应该可以做到。

activate: function() { 

    return $.when(
       datacontext.getCurrentUser(), 
       datacontext.getGroupsAuthorized(), 
       datacontext.getTeams(), 
       datacontext.getRoles(), 
       datacontext.checkPermissions('views.shell') 
       ) 
     .then(function (s0, s1, s2,s3, s4) {  
      /* code excluded */   
      return router.activate('welcome'); 

     } 
}, 

functionalways需要相应调整。

+0

看起来像这样做的伎俩! – voam

0

是否足够只是把router.activate(“欢迎”)片断的时候子句中的另一个承诺?

activate: function() {  

     var query = 
      $.when(
        datacontext.getCurrentUser(), 
        datacontext.getGroupsAuthorized(), 
        datacontext.getTeams(), 
        datacontext.getRoles(), 
        datacontext.checkPermissions('views.shell'), 
        router.activate('welcome'); 
        ) 
      .then(function (s0, s1, s2,s3, s4, s5) {  
       /* code excluded */   
      }, 
      function (f0, f1, f2) { 
       /* code excluded */ 

      }).always(function() { 
       /* code excluded */     
      }); 

      return query; 

    }, 
相关问题