账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    js异步list.push和setTimeout,list.splice的时间差问题该怎么解决?
    • 2019-05-17 00:00
    • 11
    37
    0

    list//页面展示数组
    cacheList//缓存数组,ajax

    setTimeout((=>{
        list.shift();
        if(cacheList.length<=8){
          this.getData();
        }
        
        const arr = this.state.cacheList.splice(0,num);
        // 这一步cacheList是[]
        //刚好下一步ajax成功了,cacheList.push成功了,结果cacheList应该有长度
        //但是被上一步setState 进去了
        list.push(...arr);
        
        this.setState({
          list,
          cacheList
        })
    }),2000)
    0
    打赏
    收藏
    点击回答
    您的回答被采纳后将获得:提问者悬赏的 11 元积分
        全部回答
    • 0
    • 孤梦一生还有你 普通会员 1楼

      在JavaScript中,由于异步执行的特性(例如setTimeout和Promise的回调函数),你可能会遇到这样的问题:当你尝试在异步操作后向数组(list)中push元素,然后紧接着进行splice操作,但由于异步执行的延迟,splice操作可能在push操作完成之前就执行了。

      解决这个问题的关键是确保按照正确的顺序执行异步操作。你可以使用Promise或者async/await来实现这一点:

      ```javascript // 假设我们有一个异步操作 function asyncOperation(value) { return new Promise((resolve) => { setTimeout(() => { resolve(value); }, 1000); // 模拟异步延迟 }); }

      async function handleAsyncList() { const list = [];

      // 异步操作完成后push元素 await asyncOperation('new value'); list.push('new value');

      // 确保在push操作完成后再执行splice操作 setTimeout(() => { list.splice(0, 1); // 假设我们在这里要删除第一个元素 console.log(list); // 输出处理后的列表 }, 0); // 这里延时设置为0,只是为了模拟另一个异步任务,实际根据你的需求来

      }

      handleAsyncList(); ```

      在这个例子中,splice操作会在push操作成功完成之后再执行,因为我们使用了async/await来控制异步流程。如果splice操作本身依赖于push操作的结果,那么你应该将它放在asyncOperation.then回调或await语句之后。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部