likes
comments
collection
share

实际开发中的异步问题

作者站长头像
站长
· 阅读数 28

前言

先来思考这个问题

const getData = (name: string): Promise<string> => {
  return new Promise(resolve => {
    resolve(name)
  })
}

const data: string[] = []

const initData = () => {
  const names = ['一', '二', '三', '四']
  names.map(async name => {
    const reslut = await getData(name)
    data = data.concat([reslut])
  })
  console.log(data)
}
initData()

你会得到一个空数组,这是一个简单的js同步异步的问题。

原因

因为在js中map是同步的方法,它并不会等待里面的异步逻辑执行完,再执行下一条,而是给每个函数同步的加上await,异步还没执行完,map就已经执行完了,所以在外部打印数据是空的。

js中的所有数据原型上的迭代遍历方法基本都是同步的,forEach打印也还是空数组。

解决

方法一·:使用for、for...in、for...of

const initData = async () => {
  const names = ['一', '二', '三', '四']
  for (const name of names) {
    const reslut = await getData(name)
    data = data.concat([reslut])
  }
  console.log(data)
}
initData()

这三种循环会等内部的异步逻辑执行完过后,再执行下一条逻辑。

方法二:Promise.all、Promise.allSettled

const initData = async () => {
  const names = ['一', '二', '三', '四']
  const reslut = await Promise.all(names.map(name => getData(name)))
  data = reslut
  console.log(data)
}
initData()

Promise.all是对于发起并发请求的一种解决方案。

转载自:https://juejin.cn/post/7363220284503228426
评论
请登录