【问题标题】:How to set up a function dynamically without calling it in javascript?如何动态设置函数而不在javascript中调用它?
【发布时间】:2021-05-15 05:57:55
【问题描述】:

我有一个函数同时调用多个函数并等待它们全部完成。它按预期工作。它在下面标记为parallel

我有一个数组,我想用数组中每个值的参数将它映射到一个函数中。但是,正如您可能想象的那样,该函数在映射时被正确调用,因此结果不会返回到并行结果中。下面是我正在尝试做的一个示例。

关于如何执行此操作并将结果返回到并行函数的任何想法?

目前正在做

let array = [1,2,3,4,5];
r = await parallel(
    doStuff(array[0]),
    doStuff(array[1]),
    doStuff(array[2]),
    doStuff(array[3]),
    doStuff(array[4]),
  );
  if(r.err.code) return r;

愿意做

let array = [1,2,3,4,5];

r = await parallel(array.map(v => doStuff(v)))
if(r.err.code) return r;

平行

async function waitForAll(...functions) {
  return await Promise.all(functions)
}

const parallel = async (...functions) => {
  const d = {err: {code:0,message:""},res:{}}; let r,sql,vars;

  r = await waitForAll(...functions)
  for(let i in r){ if(r[i].err.code) return r[i]; }

  d.res = r;

  return d;
}

module.exports = {
  parallel
}

编辑:doStuff() 是异步的

【问题讨论】:

  • await parallel( 还能用吗?
  • @brk 是。随着当前的实施工作以及使用它的项目的其他领域正在工作。

标签: javascript function asynchronous async-await


【解决方案1】:

由于parallel 接受任意数量的单独参数,看起来您需要做的只是传播 映射到调用的结果。现在你只传递一个数组作为第一个参数。

const array = [1,2,3,4,5];
const r = await parallel(...array.map(v => doStuff(v)))
if(r.err.code) return r;

或者更改parallel 的实现以接受一个数组作为单个参数

const parallel = async (functions) => {

然后做

const r = await parallel(array.map(v => doStuff(v)))

除非doStuff 根据是否定义了第二个或更多参数而具有不同的行为,否则您可以简化为

const r = await parallel(array.map(doStuff))

删除内联调用。

【讨论】:

  • 伟大的洞察力,谢谢。 doStuff 确实有第二个参数,因此您提供的第一个解决方案可以完美运行。谢谢!
猜你喜欢
  • 2021-02-08
  • 2017-07-12
  • 2010-10-08
  • 1970-01-01
  • 1970-01-01
  • 2011-08-17
  • 1970-01-01
  • 2011-06-27
  • 2021-07-06
相关资源
最近更新 更多