关于本课setTimeOut 延时的问题

关于本课setTimeOut 延时的问题

我看到视频中setTimeOut 延时为0,也能够起到在abort之后再缓存的作用。但是我这里必须延时大于0,否则就不起作用,这是为什么呢?

http://img1.sycdn.imooc.com//climg/5ef0b72a09bcc4ae10340332.jpg

export const request = (options = {}) => {
  const result = new Promise((resolve, reject) => {
    // 兼容 request 传入的 options 中含有成功或失败的回调
    const {success, fail} = options
    const key = options.url + '&' + (options.method || 'GET')
    const handler = wx.request(Object.assign(
      {}, options,
      {
        success: res => {
          delete pending[key]
          if (isHttpSuccess(res.statusCode)) {
            if (success) {
              success(res.data)
              return
            }
            resolve(res.data)
          } else {
            errorHandler(res)
            reject(res)
          }
        },
        fail: err => {
          delete pending[key]
          errorHandler(err)
          if (fail) {
            fail(err.data)
            return
          }
          reject(err)
        }
      })
    )
    if (pending[key]) {
      pending[key].abort()
    }
    // setTimeout 能够保证在每次 abort() 之后存值
    setTimeout(() => {
      pending[key] = handler
    }, 0)
  })
  return result
}


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

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

1回答
Brian 2020-06-24 22:16:36

你有没有在settimeout中console.log打印一下,如果你设置延迟大于0,比如1秒?

如果服务器很快就响应了,那么就不会cancel掉当前的请求。

这个地方可以了解 一下js执行机制

  • 提问者 woaixuexi3946647 #1
    服务器响应都是在slow 3g情况下,2s多。 我设置settimeout 10毫秒,在一次未完成的请求中再次请求,会先判断abort --> 中断handler --> 缓存pending。这个是没问题的 我查了一下,设置0秒也相当于在任务队列最后执行。但是我这里设置0毫秒,就相当与没加settimeout。难道是版本问题?
    2020-06-25 13:21:11
  • Brian 回复 提问者 woaixuexi3946647 #2
    js是单线程的,单线程就意味着,所有任务需要排队,前一个任务结束,才会执行后一个任务。如果前一个任务耗时很长,后一个任务就不得不一直等着。setTimeout 0是会改变执行的时序问题。你设置成10ms看不出来问题,设置成5s或者10s,你两次点击的间隙一般会大于10ms,看不出来,设置大一点吧~~~
    2020-06-27 01:31:09
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

0 星

相似问题

登录后可查看更多问答,登录/注册

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

在线咨询

领取优惠

免费试听

领取大纲

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