Javascript 错误的承诺。函数之间的all()用法?

Javascript 错误的承诺。函数之间的all()用法?,javascript,asynchronous,es6-promise,Javascript,Asynchronous,Es6 Promise,我制作这个虚拟代码是为了更好地理解承诺是如何工作的,模拟了一个我必须“承诺”的更复杂的软件。 在所附的代码中,我希望触发事件并按以下顺序记录: “before”字符串 “…检测到”的列表 “已完成…”的列表 “after”字符串 但是您可以看到,如果运行它,“after”字符串将在步骤2和步骤3之间打印。 很明显,我在处理异步逻辑时肯定做错了什么。 谢谢你的帮助 const obj={ “行”:[{ “类型”:“A”, “值”:0 }, { “类型”:“B”, “值”:0 }, { “类型

我制作这个虚拟代码是为了更好地理解承诺是如何工作的,模拟了一个我必须“承诺”的更复杂的软件。 在所附的代码中,我希望触发事件并按以下顺序记录:

  • “before”字符串
  • “…检测到”的列表
  • “已完成…”的列表
  • “after”字符串
但是您可以看到,如果运行它,“after”字符串将在步骤2和步骤3之间打印。 很明显,我在处理异步逻辑时肯定做错了什么。 谢谢你的帮助

const obj={
“行”:[{
“类型”:“A”,
“值”:0
}, {
“类型”:“B”,
“值”:0
}, {
“类型”:“C”,
“值”:0
}]
}
让承诺=[];
功能延迟(毫秒){
返回新承诺(resolve=>setTimeout(resolve,ms));
}
const alter_value=async(行、待添加、时间)=>{
等待延迟(时间);
row.value=row.value+to_add;
console.log(“使用“+row.type”完成);
返回true;
}
const two=async()=>{
obj.rows.forEach(异步(行)=>{
开关(行类型){
案例“A”:
控制台日志(“检测到的”);
promises.push(改变_值(第1000行))
承诺.推送(改变_值(第2行,第1800行))
打破
案例“B”:
控制台日志(“B检测”);
承诺推送(改变值(第51400行))
打破
案例“C”:
控制台日志(“检测到C”);
推送(改变值(第200行,第2400行))
打破
}
});
回报承诺;
}
const one=async()=>{
控制台日志(“之前”);
Promise.all(两个()).then(console.log(“after”));
}

一个()我发现您的代码中至少有两个问题,解释了您得到的结果:

  • 您的
    two
    函数不应是
    async
    <代码>异步
  • 函数返回一个隐式的
    承诺
    。在这里,您只需要返回一个您已经自己构造的
    Promise
    s数组,因此您需要一个普通函数
  • .then(console.log(“after”)
    将立即执行
    console.log
    :预期稍后会执行一个函数,因此您必须将其更改为
    。然后(()=>console.log(“after”)
  • 这就变成了:

    const obj={
    “行”:[{
    “类型”:“A”,
    “值”:0
    }, {
    “类型”:“B”,
    “值”:0
    }, {
    “类型”:“C”,
    “值”:0
    }]
    };
    功能延迟(毫秒){
    返回新承诺(resolve=>setTimeout(resolve,ms));
    }
    const alter_value=async(行、待添加、时间)=>{
    等待延迟(时间);
    row.value=row.value+to_add;
    console.log(“使用“+row.type”完成);
    返回true;
    };
    常数二=()=>{
    常量承诺=[];
    obj.rows.forEach(异步(行)=>{
    开关(行类型){
    案例“A”:
    控制台日志(“检测到的”);
    push(改变_值(第1000行));
    push(改变_值(第2行,第1800行));
    打破
    案例“B”:
    控制台日志(“B检测”);
    推送(改变_值(第51400行));
    打破
    案例“C”:
    控制台日志(“检测到C”);
    push(改变_值(第2002400行));
    打破
    }
    });
    回报承诺;
    };
    const one=async()=>{
    console.log('before');
    然后(()=>console.log('after');
    };
    
    一个()它看起来像OP请求同步行为

    演示大纲

    • 函数
      modVal(i,value,time)
      参数来自异步函数
      syncro()
      参数:
      const sync
      对象数组。每个对象都包含
      obj.rows
      的索引、该索引处的值
      obj.rows[i].value
      ,以及
      modVal()
      承诺中的超时时间

    • 参数和参数:
      constsync=[{r:0,v:1,t:1000},…]
      序号:
      对象行[
      编号
      ]

      序号v:
      对象行[seq.r].value+=
      编号
      seq.t:
      解析(对象行[i].value+=value),
      编号

    • sync
      数组由
      for…of
      循环迭代。在每次迭代中,
      等待modVal()
      被同步调用

    让obj={
    “行”:[{
    “类型”:“A”,
    “值”:0
    }, {
    “类型”:“B”,
    “值”:0
    }, {
    “类型”:“C”,
    “值”:0
    }]
    }
    常数同步=[{
    r:0,
    五:一,,
    t:1000
    }, {
    r:0,
    五:二,,
    t:1800
    }, {
    r:1,
    五:五,,
    t:1400
    }, {
    r:2,
    v:200,
    t:2400
    }];
    常量同步=异步(同步)=>{
    常量modVal=(i,值,时间)=>{
    返回新承诺(解决=>{
    setTimeout(()=>resolve(obj.rows[i].value+=value),time);
    });
    }
    for(同步顺序){
    等待修正(顺序r、顺序v、顺序t);
    log(JSON.stringify(obj.rows));
    }
    }
    同步(同步)
    
    。作为控制台行。作为控制台行::之后{
    内容:'';
    填充:0;
    保证金:0;
    边界:0;
    宽度:0;
    
    }
    constjsonarray={…}
    -这既不是数组,也不是JSON数组。那只是一个普通的老东西。你说得对@Andreas,我已经更正了它的名字