天翻地覆:object+异步调用实战训练

本文介绍了一种实现数据缓存的方法,并演示了如何利用异步加载技术更新缓存,减少重复请求,提高应用程序效率。

前面我们弄了一个new对象,然后从对象里获取数据。
http://blog.youkuaiyun.com/github_26672553/article/details/53637525
其中getList()函数每次获取都会被调用。

现在,我们给加入“数据缓存”的概念。保证getList只会调用一次(比如,第二次调用getOne()的时候不会再去调用getList)。

在ECMAScript 5.1开始,Object中支持getter和setter(就像Java一样)

_cache:{list:null},
get cache_list(){
  return this._cache.list;
},
set cache_list(value){
  this._cache.list = value;
},

我们来改造news对象:

var news = {
    _cache:{list:[],detail:{}},
    get cache_list(){
      return this._cache["list"];
    },
    set cache_list(value){
      this._cache["list"] = value;
    },
    loadCache(){
      if(this.cache_list.length == 0){
        this.cache_list = this.getList();
      }
    },

  getList(){
    return [
      {newsid:101,newstitle:"标题1"},
      {newsid:102,newstitle:"标题2"},
      {newsid:103,newstitle:"标题3"}
    ];
  },
  getOne(newsid){
    // 加载缓存
    this.loadCache();

    var index = -1;
    var getRet = this.cache_list.map((item,i)=>{
      if(item.newsid == newsid){
        index = i;
        return item;
      }
    });

    if(index >= 0){
      return getRet[index];
    }else{
      return null;
    }
  }
}

调用:

alert(news.getOne(103).newstitle);
alert(news.getOne(101).newstitle);

这样我们就实现了“数据缓存”功能(这只是一个思路)。

模拟ajax

我们暂时并不调用,只是来模拟一下(我们我们会用到fetch函数)。
设置一个定时器,在定时器到期后执行一次函数或者指定代码段。

var ajax = (doSth)=>{
    var name = "jack";
  setTimeout(function(){
    doSth(name); // doSth相当于回调函数
  },1000);
};
// 调用
ajax(function(name){
  alert(name);
});

上面代码全部换成箭头函数的写法:

var ajax = (doSth)=>{
    var name = "jack";
  setTimeout(()=>{
    doSth(name); // doSth相当于回调函数
  },1000);
};

// 调用
ajax(name=>{
  alert(name);
});

整合到news对象中

替换掉getList()中的内容,真实开发其中的数据,肯定是从后端异步获取而来。
我要学习怎么通过异步,改造news

var ajax = (doSth)=>{
    var apiData = [
      {newsid:101,newstitle:"标题1"},
      {newsid:102,newstitle:"标题2"},
      {newsid:103,newstitle:"标题3"}
    ];
  setTimeout(()=>{
    doSth(apiData); // doSth相当于回调函数
  },1000);
};


// news对象
var news = {
    _cache:{list:[],detail:{}},
    get cache_list(){
      return this._cache["list"];
    },
    set cache_list(value){
      this._cache["list"] = value;
    },
    loadCache(action){ // 加载缓存数据
      if(this.cache_list.length == 0){
        //this.cache_list = this.getList();
        ajax((apiData)=>{
          this.cache_list = apiData; // 设置新闻列表缓存
          action(); // 异步获取到数据之后的操作
        });
      }
    },
  getOne(newsid,callback){
    // 加载缓存
    this.loadCache(()=>{
        var index = -1;
        var getRet = this.cache_list.map((item,i)=>{
          if(item.newsid == newsid){
            index = i;
            return item;
          }
        });

        if(index >= 0){
          callback(getRet[index]); // 手动执行 
        }
    });

  }
}

调用:

news.getOne(103,(item)=>{
  alert(item.newstitle);
});
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值