javascript undefined_setvalidator

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


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

问题描述

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

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

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

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

异步拿到收藏

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

 *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)
  })
}

然后在effects中call这个方法,设定延迟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)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • Vue(1)Vue安装与使用[通俗易懂]

    Vue(1)Vue安装与使用[通俗易懂]前言Vue(读音/vjuː/,类似于view)是一套用于构建前后端分离的框架。刚开始是由国内优秀选手尤雨溪开发出来的,目前是全球“最”流行的前端框架。使用vue开发网页很简单,并且技术生态环境完善

    2022年7月30日
  • python中delay__python delay函数「建议收藏」

    python中delay__python delay函数「建议收藏」Python中的sleep函数本人是Python菜鸟一枚,今天用python时,发现如果按照下图所示来写程序在我的Python环境(Win7+Python2.7.9)下测试没问题,是等待5秒后再输出m。你的问题可能是被标准输出流的缓冲区缓冲了,给stdout加一个flush就可以了:fromtimeimportsleepfromsysimportstdoutprint…

    2022年6月2日
  • eclipse 加html注释快捷键

    eclipse 加html注释快捷键1.单行注释:先写下注释,然后光标放到这一行上,接着按下ctrl+shitf+C快捷键,eclipse会自动注释掉这一行。2.多行注释,拖动鼠标选中你要注释的内容,然后再按下ctrl+shitf+c

    2022年6月14日
  • IDEA插件-热部署:JRebel

    IDEA插件-热部署:JRebelspringboot项目开发过程中通常修改了某分部代码需要重启服务才能生效。通过JRebel插件可以实现热部署,避免了频繁重启服务。

    2022年6月18日
  • spin_lock &amp; mutex_lock的差别?

    spin_lock &amp; mutex_lock的差别?

    2021年11月13日
  • ElasticSearch数据库(ES数据库)简介

    ElasticSearch数据库(ES数据库)简介一elasticsearch简介**ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTfulweb接口。**Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。1elasticSearch的使用场景1、为用户提供按关键字查询的全文搜索功能。2、实现…

    2022年4月28日

发表回复

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

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