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”字符串
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,我已经更正了它的名字