Durandal:如何缓存调用?

Durandal: how to cache calls?

在我的 durandal 应用程序中,我需要知道用户是否在不同的地方登录。所以目前我正在调用以在每个需要它的视图中获取用户状态。

是否可以这样做:

//login.js

define(function(require) {
 var http = require('durandal/http')
 var isLogged;

 function getLogin() {
 if (isLogged != undefined) return isLogged
 return http.get('/api/login').then(function(data) {
  isLogged = data.logged
  return isLogged
  })
 }

 return {
  getLogin: getLogin
}

//view.js
define(function(require) {
 var login = require('login')
 function vm() {
  var self = this;
  self.isLogged;
  self.activate = function() {
   self.isLogged = login.getLogin()
  }
 }
 return vm
})

上面的方法不起作用,因为在视图 activate 方法中我需要 return 一个承诺。我怎样才能做到这一点?

可以使用guardRouter功能!

这将在所有导航中触发。

// Shell main or other file that runs before any view!
// Define the router guard function!

 require('plugin/router', 'Q', function(router, q){

     var cache = {};

     router.guardRoute = function(instance, instruction) {
         var key = instruction.fragment.toLowerCase();

         return cache[key] !== undefined ?
             cache[key]:
             q($.get(url,data)).then(_setCache, _fail);


         function _fail(/*jqhxr*/) {
            /* do something */
         }

         function _setCache(result) {
             cache[key] = result;
             return cache[key];
         }
     }

 });

如果您 return 为真,导航将继续!如果是字符串 returned,durandal 将导航到它!

缓存按您定义的方式工作(检查 javascript memoization

关于 durandal Auth chech this gitHub 以获取灵感。