当前位置: 首页 > news >正文

解决js return返回结果依赖耗时操作而返回空值或undefined问题

如果js一个代码块中有耗时操作,但是return的结果可能会依赖这个耗时操作的返回,怎么解决?

一般人可能想到的方法就是async/await

没错,正常情况下是这样的,伪代码如下:

async OuterFun() {

   const result = await timeCostFunc() // timeCostFunc是耗时操作 

   ..... 

 return finalResult  // finalResult依赖于上面的耗时操作返回的result

}

 上面需要注意的是耗时操作的函数必须返回一个promise!

 但是下面这种情况使用async/await就没有效果了

async _normalizeSongs(songs) {
      let ret = [];
      for (const song of songs) {
        const songItem = await createSong(song); // createSong是耗时操作
        ret.push(songItem);
      }
      return ret;
   }

这里的原因就在于: 遍历数组这个步骤并不是完全同步的,即便使用了async/await,也是这样。

换句话说:由于js异步执行的原因,而遍历数组本身并不是一个完全同步阻塞的操作(就算有async/await关键字), return ret这个操作可能会在for循环之前就执行了,所以返回的是一个空数组

那么问题的关键就是:要把for循环和数组push整个代码块变成一个完全同步阻塞的操作!

解决办法:把需要完全同步的部分整体封装成一个promise, 然后再通过await 这个promise同步阻塞获取结果,这样就能保证了:最终return会等待前面所有异步代码执行完毕,那么就不会return空值了

代码如下:

async  _normalizeSongs(songs) {
      // 将涉及到数组的耗时操作整体封装成一个promise
      const songPromise = new Promise(async (resolve) => {
        let ret = [];
        for (const song of songs) {
          const songItem = await createSong(song);
          ret.push(songItem);
        }
        resolve(ret); // 把耗时操作的结果丢给resolve。
      });

      // 等待这个promise同步阻塞获取结果
      const resultSongs = await songPromise;
      return resultSongs;

}

相关文章:

  • 云计算是什么?学习云计算能做什么工作?
  • Java:SpringBoot整合Spring Batch示例
  • 【GA-ACO-BP预测】基于混合遗传算法-蚁群算法优化BP神经网络回归预测研究(Matlab代码实现)
  • 深度学习硬件配置推荐
  • Grid布局
  • 项目管理之生命周期管理
  • Docker Compose和Consul
  • selenium打开火狐浏览器
  • 预约按摩app软件开发定制足浴SPA上们服务小程序
  • unity动画_UI动画案例 c#
  • 数仓建设(一)
  • Redis 主从复制,哨兵,集群——(1)主从复制篇
  • 多数元素[简单]
  • Rust初接触
  • 微服务拆分的思考
  • python的搜索引擎系统设计与实现 计算机竞赛
  • 【全栈开发指南】打包sentinel-dashboard镜像推送到Docker Hub镜像仓库
  • 问题记录1 json解析问题
  • 论文阅读:CenterFormer: Center-based Transformer for 3D Object Detection
  • 纯css手写switch
  • 茹诗瑶评《失去伊斯坦布尔》︱“帝国主义者”的多重面相
  • 印巴军事对峙加剧,小规模冲突收场还是走向大战?
  • 观察|“离境退税”撬动上海“五一”假期入境消费
  • 刘翔的赛会纪录被改写,田径钻石赛在赛场内外交出精彩答卷
  • 人形机器人,最重要的还是“脑子”
  • 全国共有共青团员7531.8万名,共青团组织439.7万个