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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • qt lineedit_个人总结学生

    qt lineedit_个人总结学生QLineEdit是一个单行文本编辑控件。使用者可以通过很多函数,输入和编辑单行文本,比如撤销、恢复、剪切、粘贴以及拖放等。通过改变QLineEdit的 echoMode() ,可以设置其属性,比如以密码的形式输入。文本的长度可以由 maxLength() 限制,可以通过使用 validator() 或者 inputMask() 可以限制它只能输入数字。在对同一个QLineEdit的validat…

    2022年10月6日
    3
  • try catch的作用

    try catch的作用trycatch的作用:当程序发生错误时,能够保证程序继续执行下去。用一个简单例子说明:1:无trycatchpublicstaticvoidmain(String[]args){ inti; i=2/0; System.out.println(i); System.out.println(1111111111); }运行结果:不会输出1111111112:有tr…

    2022年6月29日
    29
  • MySQL恢复备份读书笔记

    MySQL恢复备份读书笔记

    2021年8月29日
    73
  • 解决BASE64Encoder报错的问题

    解决BASE64Encoder报错的问题今天在用servlet写一个文件下载的案例时,想解决文件的中文显示问题。然后在导包importsun.misc.BASE64Encoder时,发现IDEA报错了,无法识别这个类。最后发现在JDK9后,官方就已经不支持importsun.misc.BASE64Encoder了。网上说了很多,第一种是把JDK的版本降低到1.8以内。但是我觉得这不是解决的最好办法。我觉得应该去修改原有的代码。所以我采用了官方提供了新的jar包importjava.util.Base64。下面这个java类的本意

    2022年6月15日
    52
  • Win10 2004显示无法访问Internet小地球 却可以上网 的 简单解决办法「建议收藏」

    最简单的解决办法把下面的代码复制到记事本,并另存为为reg后缀名的文件(例如:修复网络.reg)双击打开并重启即可解决问题WindowsRegistryEditorVersion5.00[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NlaSvc\Parameters\Internet]”ActiveDnsProbeContent”=”131.107.255.255″”ActiveDnsProbeContentV6″=”f

    2022年4月8日
    48
  • 无线信道特征_无线信道模型有哪几种

    无线信道特征_无线信道模型有哪几种目录1统计性模型(经验模型)1.1模型分类(1)按衰落分类(2)按路径损耗和延迟拓展分类1.2建模方法(1)方法一分类(2)方法二分类2确定模型2.1建模方法3半确定模型3.1建模方法4思维导图PDF、xmind格式下载5参考文献1统计性模型(经验模型)1.1模型分类(1)按衰落分类小尺度传播衰落模型描述小范围内信号的幅度和相位的快速衰落,在电波传播过程中,信号场强在短短(几个信号波长)或短时(秒级)上呈现出快速波动的状况,包括由移动台和基站相对运动造成多普勒频移引起的时间

    2022年9月23日
    4

发表回复

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

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