javascript - 如果想实现:Parallel between loops,多个异步操作在循环中串行运行,代码该怎么写?

标签 javascript node.js

我在 previous question 中犯了一个错误,导致受访者无法理解我的意思。所以我又问了一个新问题。

我需要在循环中处理多个异步操作。这些异步操作我使用await让它们串行执行。我想要的结果是循环是并行的,每个循环中的异步操作串行运行,但结果都是串起来的。这种情况如何解决?

在每个循环中,我使用 await 来处理 Promise ,它是异步操作的。但都是串行的。

我的代码是这样的:

var func1 = function(){return new Promise(function(resolve, reject){
    //After 10s print(1);
    loadRes("resname_1", 
        (res)=>{print(1); resolve(res);},
        (err)=>{reject(err);});
 })}

 var func2 = function(){return new Promise(function(resolve, reject){
    //After 10s print(2); 
    //some async operation like above
 })}

 var func3 = function(){return new Promise(function(resolve, reject){
    //After 10s print(3); 
    //some async operation like above
 })}


 var test = async function(){
    //some code...;
    await func1;

    //some code...;
    await func2;
    await func3;
 }

 for(let i = 0; i < 3; ++i){
    test();
 }

我得到的结果:111222333,总秒数:90

我想要的是:同时输出3次123,每次123串行,总共30秒。

最佳答案

您的代码已经具有预期的行为。您声称执行需要 90 秒,但您提供的代码只需要 30 秒。这是您的代码的复制品,所有延迟都减少了 10 倍以加快速度。因此,这将等待一秒,记录 111,然后等待一秒,记录 222,然后等待一秒,记录 333。总时间,3 秒(如果我完成完整的持续时间,则相当于 30 秒)

const delay = (duration) => new Promise(resolve => setTimeout(resolve, duration));
const func1 = () => delay(1000).then(() => console.log(1));
const func2 = () => delay(1000).then(() => console.log(2));
const func3 = () => delay(1000).then(() => console.log(3));

const test = async () => {
  await func1();
  await func2();
  await func3();
}

for(let i = 0; i < 3; ++i){
  test();
}

关于javascript - 如果想实现:Parallel between loops,多个异步操作在循环中串行运行,代码该怎么写?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58677033/

相关文章:

javascript - 使用带有 and or 的括号会造成混淆

javascript - 链接 promise 但具有不同的参数

javascript - 根据滚动位置显示消息

javascript - 为什么我的对象在 for 循环中从最后一个到第一个?

javascript - 如何使用 slider 和调整大小属性调整图像大小

javascript - 如何在discord.js 中使用用户ID 来ping 用户?

node.js - 创建构造函数签名

JavaScript:数组中的多个clearTimeout

javascript - 从某些人身上获取值(value)?

node.js - Visual Studio 中的 Node js 项目错误。 "The specified path, file name, or both are too long"