是否使用javascript;异步;功能';s body以任何不同的方式执行,如果它不';“我没有一个”;等待“;在里面?

是否使用javascript;异步;功能';s body以任何不同的方式执行,如果它不';“我没有一个”;等待“;在里面?,javascript,async-await,event-loop,Javascript,Async Await,Event Loop,来自MDN 异步函数通过事件循环以与代码其余部分不同的顺序运行 然而,我不明白这对于一个不显式返回任何内容并且根本不使用wait的简单函数意味着什么。在这种情况下,声明函数async是否有用?它是否会在以后执行以允许页面响应(例如,在执行时)?我的测试显示它是同步执行的,根本不延迟: 异步函数foo(){ console.log('Start heavy stuff'); 对于(设i=0;i{ log(“来自示例1的承诺已实现”); }); log(“调用example1之后”)不,像示例中的

来自MDN

异步函数通过事件循环以与代码其余部分不同的顺序运行

然而,我不明白这对于一个不显式返回任何内容并且根本不使用wait的简单函数意味着什么。在这种情况下,声明函数async是否有用?它是否会在以后执行以允许页面响应(例如,在执行时)?我的测试显示它是同步执行的,根本不延迟:

异步函数foo(){ console.log('Start heavy stuff'); 对于(设i=0;i<90000000;++i){ 数学随机 } console.log('Fnish-weight-stuff') } foo();
log('All done,synchronously')
异步
函数同步运行,直到到达第一个
等待
返回
,抛出错误,或者代码执行刚刚从函数末尾结束(就像在函数中一样)。此时,函数返回一个承诺

在这种情况下,声明函数
async
是否有用

不是在那个特定的情况下,不是。函数似乎没有任何理由返回承诺,它的所有工作都是同步完成的,正如您在测试中看到的那样

它是否会在以后执行以允许页面响应(例如,在执行时)

没有

当函数不使用
wait
时,实际上没有很好的理由声明函数
async
。它使它返回一个承诺,但除此之外不做任何其他事情。也许如果你打算在承诺链中使用它,但是

下面是一个稍微不同的示例,说明了
async
函数是如何同步运行的:

异步函数example1(){
log(“这是同步完成的”);
等待承诺;
log(“这是异步完成的”);
}
log(“调用example1之前”);
示例1()。然后(()=>{
log(“来自示例1的承诺已实现”);
});

log(“调用example1之后”)不,像示例中的“重”Math.random()循环这样的同步代码不会以任何方式运行

然而,不同之处在于,使用
async
函数构造这样的东西,让其他代码运行,几乎是微不足道的,因为所有这些繁重的工作都使它成为一个协同程序/生成器/。。。在传输期间或运行时发生

function delay(ms) {
  return new Promise((resolve) => setTimeout(resolve, ms));
}

// or maybe:

function continueSoon() {
  return new Promise((resolve) => setImmediate(resolve));
}

async function foo() {
  console.log("Start heavy stuff");
  for (let i = 0; i < 90000000; ++i) {
    Math.random();
    if(i % 10000 == 0) await delay(10);
  }
  console.log("Fnish heavy stuff");
}
功能延迟(ms){
返回新承诺((resolve)=>setTimeout(resolve,ms));
}
//或者可能:
函数continueSoon(){
返回新承诺((resolve)=>setImmediate(resolve));
}
异步函数foo(){
log(“启动重型设备”);
对于(设i=0;i<90000000;++i){
数学随机();
如果(i%10000==0)等待延迟(10);
}
console.log(“Fnish-weight-stuff”);
}

除非函数中有异步代码,否则没有区别。答案写得很好+1,我想这可以移动到dupe目标。:)@代码狂人-谢谢。我早该知道有一个好搭档。我想这个问题的措辞已经足够具体了,所以我将把它留在这里,但是。。。