Javascript 是否只有在执行服务器应用程序时才需要Node.js中的异步操作?

Javascript 是否只有在执行服务器应用程序时才需要Node.js中的异步操作?,javascript,node.js,asynchronous,async-await,Javascript,Node.js,Asynchronous,Async Await,例如,在我正在编写的Node.js应用程序中,有一段代码沿着这些行包装在async函数中: await a(param1); await b(param2); await c(param3); await d(param4); 据我所知,如果我的应用程序是服务器,这将是一件好事,因此,例如,向我的服务器发送请求的用户1可能处于阶段等待a(param1)可能这个请求需要很多时间,所以另一个处于阶段的用户2等待b(param2)仍然可以继续处理其请求(不必等待用户1请求的解决) 但是,如果只有一个

例如,在我正在编写的Node.js应用程序中,有一段代码沿着这些行包装在
async
函数中:

await a(param1);
await b(param2);
await c(param3);
await d(param4);
据我所知,如果我的应用程序是服务器,这将是一件好事,因此,例如,向我的服务器发送请求的用户1可能处于阶段
等待a(param1)可能这个请求需要很多时间,所以另一个处于阶段
的用户2等待b(param2)仍然可以继续处理其请求(不必等待用户1请求的解决)

但是,如果只有一个用户使用我的应用程序,我看不到使用异步代码的任何好处,因为使用
await
会将异步代码转换为“sync”,因为函数
b
a
完成后才会继续

我的理解正确吗


编辑:函数
a
b
c
d
返回承诺,下一个承诺取决于上一个承诺

我的理解正确吗

如果
a
b
c
d
返回承诺(隐式地,因为它们也是
异步
函数,或者显式地),则不会返回承诺,如果您对它们使用
等待
,它们可能会返回承诺<代码>异步
/
等待
不要使异步代码同步(这是不可能的),它们允许您在其逻辑流而不是时间流中编写代码

如果删除那些
wait
s,您将更改代码的逻辑:而不是运行
a
完成,然后运行
b
,然后运行
c
,然后运行
d
,它将启动所有这些代码,并且它们都将重叠。因此,与此相反:

constrnd=()=>Math.floor(Math.random()*800);
const runner=name=>newpromise(解析=>{
console.log(name+“start”);
设置超时(()=>{
console.log(名称+“结束”);
解决();
},rnd())
});
常数a=()=>跑步者(“a”);
常数b=()=>runner(“b”);
常数c=()=>runner(“c”);
常数d=()=>runner(“d”);
(异步()=>{
等待一个();
等待b();
等待c();
等待d();
console.log(“所有调用之后”);
})(); // 在实际代码中,您会捕获错误
。作为控制台包装器{
最大高度:100%!重要;
}
我的理解正确吗

如果
a
b
c
d
返回承诺(隐式地,因为它们也是
异步
函数,或者显式地),则不会返回承诺,如果您对它们使用
等待
,它们可能会返回承诺<代码>异步
/
等待
不要使异步代码同步(这是不可能的),它们允许您在其逻辑流而不是时间流中编写代码

如果删除那些
wait
s,您将更改代码的逻辑:而不是运行
a
完成,然后运行
b
,然后运行
c
,然后运行
d
,它将启动所有这些代码,并且它们都将重叠。因此,与此相反:

constrnd=()=>Math.floor(Math.random()*800);
const runner=name=>newpromise(解析=>{
console.log(name+“start”);
设置超时(()=>{
console.log(名称+“结束”);
解决();
},rnd())
});
常数a=()=>跑步者(“a”);
常数b=()=>runner(“b”);
常数c=()=>runner(“c”);
常数d=()=>runner(“d”);
(异步()=>{
等待一个();
等待b();
等待c();
等待d();
console.log(“所有调用之后”);
})(); // 在实际代码中,您会捕获错误
。作为控制台包装器{
最大高度:100%!重要;

}
异步代码的目的不仅仅是允许多个用户使用应用程序,还允许多个任务与单个线程同时执行

如果单个用户使用应用程序(例如web服务器),则用户可能需要同时请求。浏览器能够同时发出请求,并且能够做到这一点。如果代码是同步且阻塞的,则在同步例程完成之前,web服务器不会响应

即使同步控制流目前适合于非web应用程序,也不能保证将来不需要将其重写为异步。示例是CLI应用程序的微调器指示器

但是,如果只有一个用户在使用我的应用程序,我看不到使用异步代码的任何好处,因为使用await会将异步代码转换为“sync”,因为函数b在完成一个应用程序之前不会继续

仅当
a
等返回承诺时。在这种情况下,省略
wait
将导致并发和不可控的承诺。在任何其他情况下,
wait
不会改变代码的工作方式,只会引入一个滴答声延迟


另一个答案提到,
await
then
的语法糖。它不会使代码同步,而是执行串联的承诺操作,这与同步代码的工作原理类似。

异步代码的目的不仅仅是允许多个用户使用应用程序,而是允许多个任务与单个线程同时执行

如果单个用户使用应用程序(例如web服务器),则用户可能需要同时请求。浏览器能够同时发出请求,并且能够做到这一点。如果代码是同步且阻塞的,则在同步例程完成之前,web服务器不会响应

即使同步控制流目前适合于非web应用程序,也不能保证将来不需要将其重写为异步。示例是CLI应用程序的微调器指示器

但是,如果只有一个用户在使用我的应用程序,我看不到使用异步代码的任何好处,因为使用await会将异步代码转换为“sync”,因为函数b在完成一个应用程序之前不会继续

仅当
a
等返回承诺时。省略
wait
将导致并发和不可控