如何按顺序执行javascript?

如何按顺序执行javascript?,javascript,promise,sequence,Javascript,Promise,Sequence,我期望输出:A,B,C。但它不起作用。如果不能更改函数handleClick(element),如何更改其他函数以确保所有代码按顺序执行并按预期输出A、B、C 异步函数handleClick(元素){ setTimeout(函数(){ log(`单击元素${Element}`); } ,数学随机(5)*1000); } 异步函数clickLetter(字母){ 等待handleClick(信件); } 异步函数clickGroup(组){ 等待handleClick(组); } 常量字母=['

我期望输出:A,B,C。但它不起作用。如果不能更改函数handleClick(element),如何更改其他函数以确保所有代码按顺序执行并按预期输出A、B、C

异步函数handleClick(元素){ setTimeout(函数(){ log(`单击元素${Element}`); } ,数学随机(5)*1000); } 异步函数clickLetter(字母){ 等待handleClick(信件); } 异步函数clickGroup(组){ 等待handleClick(组); } 常量字母=['A','B','C']; 功能点击字母(字母,fn){ 设指数=0; 返回新承诺(功能(解决、拒绝){ 函数next(){ if(索引<字母长度){ fn(字母[index++])。然后(下一步,拒绝); }否则{ 解决(); } } next(); }); }
单击字母(字母,单击字母)如前所述,
async
库是实现这一点的一种方法

如果要继续使用当前的解决方案,问题在于
handleClick()
中的隐式承诺在超时之前立即返回。然后,根据每次传递的随机超时,它将导致out或ordr执行。解决方法就是解决承诺,然后它就会超时

函数handleClick(元素){
返回新承诺(解决=>{
setTimeout(函数(){
log(`单击元素${Element}`);
解决();
}
,数学随机(5)*1000);
});
}
异步函数clickLetter(字母){
等待handleClick(信件);
}
功能点击字母(字母,fn){
设指数=0;
返回新承诺(功能(解决、拒绝){
函数next(){
if(索引<字母长度){
fn(字母[index++])。然后(下一步,拒绝);
}否则{
解决();
}
}
next();
});
}
常量字母=['A','B','C'];

单击字母(字母,单击字母)阅读有关异步的内容并在此处等待

这是代码。解释在最后

异步函数handleClick(元素){ 返回新承诺((解决、拒绝)=>{ setTimeout(函数(){ log(`单击元素${Element}`); 解决(); },数学随机(5)*1000); }); } 异步函数clickLetter(字母){ 等待handleClick(信件); } 异步函数clickGroup(组){ 等待handleClick(组); } 常量字母=['A','B','C']; 异步函数clickLetters(字母,fn){
对于(设i=0;i,
setTimeout
函数是异步的,并且结果会立即返回,您需要将其包装在承诺构造函数中,然后解析它

函数handleClick(元素){
返回新承诺((解决、拒绝)=>{
设置超时(()=>{
log(`Clicked on Element_${Element}`);
解决();
},数学随机(5)*1000);
});
}
异步函数clickLetter(字母){
等待handleClick(信件);
}
异步函数clickGroup(组){
等待handleClick(组);
}
常量字母=['A','B','C'];
异步函数clickLetters(字母,fn){
for(设i=0;iclickLetters(letters,clickLetter);
你可以使用
async
库,你得到答案了吗?@Cristy不,你不能。承诺没用。@Bergi你能详细说明一下吗?它不能像
async.eachSeries(letters,clickLetter)那样使用吗
?@Cristy不,它不能。
clickLetter
返回一个承诺,它不接受节点式回调。因此,如果我希望异步函数等待完成,我应该将其包装在承诺中?如果异步函数包含多级嵌套异步调用,我必须用承诺包装每一级?您会希望这样做吗无论何时处理回调函数,比如
setTimeout
第一个参数。