当前位置: 首页 > 知识库问答 >
问题:

如何在Javascript中并行运行async/await

呼延鸿畅
2023-03-14

最后,Async/Await很快将在除IE以外的所有主要浏览器中得到支持。因此,现在我们可以开始使用Async/Await编写更易读的代码,但是有一个问题。很多人像这样使用异步等待:

const userResponse = await fetchUserAsync();
const postsResponse = await fetchPostsAsync();
fn task() {
  result-1 = doAsync();
  result-2 = doAsync();
  result-n = doLongAsync();

  // handle results together
  combinedResult = handleResults(result-1, result-2);

  lastResult = handleLastResult(result-n);
}

共有1个答案

谷梁云瀚
2023-03-14

您可以这样写:

const responses = await Promise.all([
 fetchUserAsync(),
 fetchPostsAsync(),
]);

const userResponse = responses[0];
const postsResponse = responses[1];

这很容易吧?但有个陷阱。promise.all具有fain-fast行为,这意味着,一旦其中一个promise被拒绝,它就会被拒绝。可能您想要一个更健壮的解决方案,我们负责处理拒绝,任何取货。幸运的是,有一个解决方案,它可以通过异步/Await实现,而不需要使用promere.all。一个工作示例:

console.clear();

function wait(ms, data) {
  return new Promise( resolve => setTimeout(resolve.bind(this, data), ms) );
}

/** 
 * This will run in series, because 
 * we call a function and immediately wait for it's result, 
 * so this will finish in 1s.
 */
async function series() {
  return {
    result1: await wait(500, 'seriesTask1'),
    result2: await wait(500, 'seriesTask2'),
  }
}

/** 
 * While here we call the functions first,
 * then wait for the result later, so 
 * this will finish in 500ms.
 */
async function parallel() {
  const task1 = wait(500, 'parallelTask1');
  const task2 = wait(500, 'parallelTask2');

  return {
    result1: await task1,
    result2: await task2,
  }
}

async function taskRunner(fn, label) {
  const startTime = performance.now();
  console.log(`Task ${label} starting...`);
  let result = await fn();
  console.log(`Task ${label} finished in ${ Number.parseInt(performance.now() - startTime) } miliseconds with,`, result);
}

void taskRunner(series, 'series');
void taskRunner(parallel, 'parallel');


/* 
 * The result will be:
 * Task series starting...
 * Task parallel starting...
 * Task parallel finished in 500 milliseconds with, { "result1": "parallelTask1", "result2": "parallelTask2" }
 * Task series finished in 1001 milliseconds with, { "result1": "seriesTask1", "result2": "seriesTask2" }
 */
 类似资料:
  • 我是新手,所以如果我错过了一些明显的东西,请事先道歉,但是我不知道如何在WebStrem中运行JavaScript。网络Storm留档说只需在浏览器中打开超文本标记语言文件,但这似乎不起作用。不管怎样,一切都在codepen.io. 以下是超文本标记语言(用于简单的天气应用程序): 这是脚本(仍在草稿中,因为它需要扩展以链接到涵盖“天气”所有值的图像): 非常感谢任何帮助!

  • 为了减少测试的运行时间,我希望并行运行测试。我有几个不能并行运行的类。 假设我有两种类型的类:-并行类-包含类1,类2-不并行类-包含类3,类4我想并行运行类1和类2到类3和类4(但lass3不会并行运行到类4) 我试图这样做: 我并行运行这两个测试,但只有第一个测试具有类的并行性。 如果我可以选择添加parallel=“classes”进行测试,我尝试在TestNG文档中搜索。我看不到,但它正在

  • 我不能在不同浏览器的browserstack中并行运行特性文件(java-maven-intellij)。我能够在我的JUnit框架中实现并行测试,但不知道如何在cucumber Java中实现。你能帮忙吗? 目前,我能够在browserstack上执行测试,但只能在一个浏览器上执行。请看附件

  • 请让我知道是否可以通过TestNG运行并行套件?

  • 主套房.java 对于每个测试套件,都有包含@Test的类 例如 TestSuite1.java TestClass1.java 所以我的问题是如何运行TestSuite1、TestSuite2

  • 我有一套为Cucumber-JVM编写的验收测试。为了减少反馈时间,我想并行运行(功能)的场景。如何以最简单、最方便的方式做到这一点? (我更希望能够在Java代码中表达这一点,作为一个常规的JUnit测试/运行程序,即我不希望使用maven-sureFire或maven-故障安全插件来解决一些问题,这将需要(?)之后对Cucumber报告进行旋转和合并。)