为什么还要对单篇文章进行判空?

为什么还要对单篇文章进行判空?

// 读取缓存

var postsCollected = wx.getStorageSync("postsCollected")


// 如果缓存为空会报错,所以要在有缓存的情况下才执行setData

if(postsCollected){

// 针对单篇文章

var collected=postsCollected[postId]

// 对空进行判断,以防出错

if(collected){

this.setData({ collected: postsCollected[postId] })

}

}else{

// 如果没有postsCollected,即是没有缓存的情况下,默认设置为空对象,默认缓存的内容为false设置false

var postsCollected={};

postsCollected[postId]=false;

// 写缓存

wx.setStorageSync("postsCollected",postsCollected)

}


为什么点击第一篇文章就没有报错,而点击第二篇文章就报错?对单篇文章进行判空,那没有点击文章之前,storage不是没有数据吗?那就是每篇文章都为空,那为什么点击第一篇文章的时候不报错?


正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

3回答
见信 2019-06-19 23:49:59

onColletionTap: function (event) {

       // this.getPostsCollectedSyc();

       this.getPostsCollectedAsy();

   },


   getPostsCollectedAsy: function () {

       var that = this;

       wx.getStorage({

         key: "posts_collected", //从缓存中获取 posts_collected

           success: function (res) {

               var postsCollected = res.data;  //缓存中的数据


             var postCollected = postsCollected[that.data.currentPostId];  //假设现在缓存没有任何数据,那么对当前这篇文章, postCollected 就位undifined

             console.log(postCollected);//undifined

               // 收藏变成未收藏,未收藏变成收藏

               postCollected = !postCollected; //然后到了这,对一个undifined的值进行取反,postCollected就变成了true,现在这个缓存就有了第一个 键值对 ,就是你当前点击收藏按钮的这篇文章,值为true。

               postsCollected[that.data.currentPostId] = postCollected;

               that.showToast(postsCollected, postCollected);

           }

       })

   }

上面那个你看的不是很方便,重新粘贴一个有格式的

这是后面的代码,这个缓存大概的逻辑就是,当你点击进入文章,但是不进行收藏时,缓存里没有任何的键值对,当你对任意一篇文章就行收藏时,才会把这篇文章是否收藏以 键值对 的方式写入缓存,收藏为true,当你取消这篇文章的收藏时,简直队取反会变为false,但是也仅仅是针对你点击了收藏的这篇文章,其他的文章只要你不动收藏按钮就不会有对应的键值对 出现在缓存里,也就是说你点过几篇文章的收藏按钮,就会有几个键值对在缓存内。

见信 2019-06-19 23:11:32

没有点击文章之前,storage不是没有数据吗?那就是每篇文章都为空,那为什么点击第一篇文章的时候不报错?-----因为你点击第一篇文章并没有对文章进行赋值,

var postsCollected = wx.getStorageSync('posts_collected')仅仅是从文章中取出数据=================================================

而点击第二篇文章就报错这个我不懂你说的是什么意思?

  • 提问者 soso_crazy #1
    老师在点击蟹的那一个item的时候没有报错,但是点击下一个比利的那张图的item就出现错误了
    2019-06-19 23:13:54
  • 见信 回复 提问者 soso_crazy #2
    因为你还没把课程看完,所以有的东西看到的还不是很完整,onColletionTap: function (event) { // this.getPostsCollectedSyc(); this.getPostsCollectedAsy(); }, getPostsCollectedAsy: function () { var that = this; wx.getStorage({ key: "posts_collected", //从缓存中获取 posts_collected success: function (res) { var postsCollected = res.data; //缓存中的数据 var postCollected = postsCollected[that.data.currentPostId]; //假设现在缓存没有任何数据,那么对当前这篇文章, postCollected 就位undifined console.log(postCollected);//undifined // 收藏变成未收藏,未收藏变成收藏 postCollected = !postCollected; //然后到了这,对一个undifined的值进行取反,postCollected就变成了true,现在这个缓存就有了第一个 键值对 ,就是你当前点击收藏按钮的这篇文章,值为true。 postsCollected[that.data.currentPostId] = postCollected; that.showToast(postsCollected, postCollected); } }) } 这是后面的代码,这个缓存大概的逻辑就是,当你点击进入文章,但是不进行收藏时,缓存里没有任何的键值对,当你对任意一篇文章就行收藏时,才会把这篇文章是否收藏以 键值对 的方式写入缓存,收藏为true,当你取消这篇文章的收藏时,简直队取反会变为false,但是也仅仅是针对你点击了收藏的这篇文章,其他的文章只要你不动收藏按钮就不会有对应的键值对 出现在缓存里,也就是说你点过几篇文章的收藏按钮,就会有几个键值对在缓存内。
    2019-06-19 23:48:29
见信 2019-06-19 22:38:27

原理跟对所有的文章也就是缓存判空一样,如果你对postsCollected赋值,postsCollected为null为报错,你对collected赋值,这个值为null的话当然也会报错,一样的原理,所以你得先判空

问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
3.WebAPP开发与小程序
  • 参与学习           人
  • 提交作业       622    份
  • 解答问题       6815    个

微信带火了小程序,也让前端工程师有了更多的展现机会,本阶段带你从移动基础知识的学习到webAPP开发,及小程序开发,让你PC端与移动端两端通吃。

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师