javascript undefined_setvalidator

javascript undefined_setvalidator解决DvaJS在models中的effects无法setInterval和setTimout的问题

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

问题描述

今天写一个取消收藏的功能遇到问题。

取消收藏的流程是这样的:点击取消收藏后会做unshare的请求对项目取消收藏,等请求结束后会弹出窗口提示成功取消,然后发送获取收藏的请求,更新收藏内容状态。这时候出现了一个问题,当我对一个项目进行取消收藏后,更新过来的内容里还是有我取消的那个项目。开始以为是取消收藏失败了,但刷新之后重新获取的收藏内容里又成功了。

通过多次尝试后发现,是因为取消收藏这个api太慢了,点击取消后获取全部收藏没能快速反应过来。

所以想到拿到total这个参数,然后判断请求过来的总数有没有变化,变化了在更新收藏内容。

异步拿到收藏

这样就得写两个effects了,刚进入收藏页面的时候通过api拿到所有收藏;然后点击取消收藏后,触发取消收藏api,这时候yield put到新的effectsaftergetcollection

 *aftergetcollection({ 
    payload},{ 
    call,put}){ 
   
      //请求收藏的项目
         let res
         res=yield call(Middleware.getcollection,[payload[0],payload[1]])
             
           let timer= setInterval(()=>{ 
   
                if(res.data.total<payload[2]){ 
   
            yield put({ 
   
               type:'createcollection',
               token:payload[1],
               total:res.data.total,
               payload:res.data.results,
               page:"1",
             })
           }
              },1000)
    },

通过 setInterval 不断判断total是否比之前的少,如果判断正确跳到同步的createcollection,然后找一个时机 clearInterval() 就行了。

然而这样做肯定是不对的
在这里插入图片描述编译器直接报错了。原因很简单,因为yield表达式只能用在 Generator 函数里面。那么在effects中就无法使用 setTimout()setInterval() 这样的函数了。

在Effects中做循环

其实想要在models中做定时器和循环很简单,yield提供的put方法就是一个很好的循环方法,只需要对effects自身做put,就可以无限的循环了,但是循环的速度很快会对性能造成影响,所以接下来解决定时器的问题就可以了。

 *aftergetcollection({ 
    payload},{ 
    call,put}){ 
   
      //请求收藏的项目
         let res
         res=yield call(Middleware.getcollection,[payload[0],payload[1]])
            if(res.data.total<payload[2]){ 
   
            yield put({ 
   
               type:'createcollection',
               token:payload[1],
               total:res.data.total,
               payload:res.data.results,
               page:"1",
             })
           }else{ 
   
           //对effects自身put
             yield put({ 
   
               type:"aftergetcollection",
               payload:payload
             })
           }
    },

models的定时器的方法其实可以在外侧写,在顶部定义一个常量delay,然后在里面写一个setTimeout的方法

const delay = (timeout) => { 
   
  return new Promise(resolve => { 
   
    setTimeout(resolve,timeout)
  })
}

然后在effectscall这个方法,设定延迟1秒就可以了

  yield call(delay, 1000)
             yield put({ 
   
               type:"aftergetcollection",
               payload:payload
             })

完整代码:

const delay = (timeout) => { 
   
  return new Promise(resolve => { 
   
    setTimeout(resolve,timeout)
  })
export default { 
   
  namespace:"collectioninfo",
  state:{ 
   
     ...
  },
   effects:{ 
   
 *aftergetcollection({ 
    payload},{ 
    call,put}){ 
   
      //请求收藏的项目
         let res
         res=yield call(Middleware.getcollection,[payload[0],payload[1]])
           if(res.data.total<payload[2]){ 
   
            yield put({ 
   
               type:'createcollection',
               token:payload[1],
               total:res.data.total,
               payload:res.data.results,
               page:"1",
             })
           }else{ 
   
             yield call(delay, 1000)
             yield put({ 
   
               type:"aftergetcollection",
               payload:payload
             })
           }
    },
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/188644.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Js排序算法_js 排序算法

    Js排序算法_js 排序算法一、概念快速排序算法由C.A.R.Hoare在1960年提出。它的时间复杂度也是O(nlogn),但它在时间复杂度为O(nlogn)级的几种排序算法中,大多数情况下效率更高,所以快速排序的应用非常广泛。注意:快速排序不一定是最快的排序方法,这取决于需要排序的数据结构、数据量。不过,大多数情况下,面试官和工作场所用它的概率也是相对较高的,所以我们应该花时间把它学透彻。二、工作原理首先设定一个分界值,通过该分界值将数组分成左右两部分。将大于或等于分界值的数据集中到数组右边

    2022年9月1日
    4
  • 我的世界java手机_我的世界java手机版

    我的世界java手机_我的世界java手机版我的世界java手机版是一款非常好玩的模拟经营游戏,游戏非常的自由,你几乎可以在游戏中干任何事,你可以自己建造一个世界,或是制作一个像素版的动漫人物,你还可以探索这个世界,寻找资源,你还可以和好友一起在这里进行对抗,你还在等什么,赶快来体验吧!我的世界java手机版游戏特色没有华丽的画面,没有什么游戏特效但是它最大的优势就是在于它的游戏性玩家在一个完全开放的世界,可以完全按照自己的想法建造我的世界…

    2022年7月8日
    20
  • Git之常用命令

    Git之常用命令

    2020年11月19日
    273
  • ParameterizedThreadStart 实例化[通俗易懂]

    ParameterizedThreadStart 实例化[通俗易懂]C#之线程ParameterizedThreadStart今天用到了ParameterizedThreadStart的实例化对象,但是总提示没有与委托匹配的重载,网上搜索了很多,终于明白什么原因了,再次记录下方便以后查阅。classProgram{staticvoidMain(string[]args){Workwork=newWork();//两种实…

    2022年7月15日
    17
  • Dirty deeds done dirt cheap_centos 8 stratis

    Dirty deeds done dirt cheap_centos 8 stratis文章目录[隐藏]TweakSwaponCentOS7TweakSwaponCentOS7Swapisquiteimportantonasmallvirtualmachinebutalsoonlargeservers.Ifyouhaven’tenabledSwapyetyoushouldcheckthefollowingguideh…

    2022年10月8日
    4
  • 设计模式——六大原则[通俗易懂]

    设计模式——六大原则[通俗易懂]设计模式——六大原则

    2022年4月24日
    36

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号