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

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

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    js异步list.push和setTimeout,list.splice的时间差问题该怎么解决?
    20
    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
    打赏
    收藏
    点击回答
    您的回答被采纳后将获得:提问者悬赏的 10 元积分
        全部回答
    • 0
    • 壹廂情願° 普通会员 1楼

      在JavaScript中,异步list.push和setTimeout都可能导致列表的长度增加,然后异步list.splice的执行顺序可能会受到影响。为了解决这个问题,我们可以使用Promise和async/await语法。

      假设我们有一个异步列表list,我们想在异步异步添加一个新的元素到列表后立即调用splice方法,这可能会导致splice方法的执行顺序出现问题。我们可以使用Promise来解决这个问题:

      ```javascript async function appendToList() { const newElement = 'Hello, world!'; return new Promise((resolve, reject) => { setTimeout(() => { list.push(newElement); resolve(); }, 1000); }); }

      appendToList().then(() => { console.log(list); // 输出:["Hello, world!", "Hello, world!"] console.log(list.splice(1, 1)); // 输出:["Hello, world!"] }); ```

      在这个例子中,我们使用了Promise来管理异步操作。当新的元素被添加到列表后,我们立即调用Promise的resolve方法,这将导致splice方法立即执行。当我们调用splice方法时,它会先执行setTimeout函数,然后再执行list.push函数。

      这种方法可以确保splice方法的执行顺序不会受到影响。

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