lodash groupBy 是一个长时间的同步操作,导致所有其他异步操作都处于饥饿状态

问题描述 投票:0回答:1

我在一个大数组上使用 lodash group by, 该操作需要几分钟,这使得所有其他异步承诺者都挨饿 (因为我们没有发布上下文)

有人建议使用不同的库\修改我对 groupBy 的使用来解决这个问题吗?

javascript typescript asynchronous async-await lodash
1个回答
0
投票

所以 groupBy 只是

function groupBy<T, V extends PropertyKey>(
  list: T[], get: (v:T) => V,
): Record<V, T[]> {
  const r = {} as Record<V, T[]>
  for (const el of list) {
    (r[get(el)] ??= []).push(el)
  }
  return r
}

如果时间太长,您可以轻松添加拦截器来等待:

async function groupBy<T, V extends PropertyKey>(
  list: T[], get: (v:T) => V,
): Record<V, T[]> {
  const r = {} as Record<V, T[]>
  let now = performance.now()
  for (const el of list) {
    // if `get` is fast, better to smth like `if (i%100==0)` here
    if (performance.now() - now > 10 /*ms*/) {
      // break the execution
      await new Promise(setTimeout) // or whatever waiting function
      now = performance.now()
    }
    (r[get(el)] ??= []).push(el)
  }
  return r
}
© www.soinside.com 2019 - 2024. All rights reserved.