Javascript 当异步实际上意味着同步运行时,这难道不具有误导性吗?

Javascript 当异步实际上意味着同步运行时,这难道不具有误导性吗?,javascript,async-await,Javascript,Async Await,我的意思是,以下代码只是同步运行的: someReceiveACallback('event', async () { const result = await imAsync() /*1*/ let anotherResult = null /*2*/ if (result.authenticated) anotherResult = await imAlsoAsync() /*3*/ send(anotherResult) /*4*/ }) 流程只是:

我的意思是,以下代码只是同步运行的:

 someReceiveACallback('event', async () {
   const result = await imAsync() /*1*/
   let anotherResult = null /*2*/
   if (result.authenticated)
     anotherResult = await imAlsoAsync() /*3*/
   send(anotherResult) /*4*/
 })
流程只是:1->2->3->4,就好像它是同步的一样


如果默认行为是异步的,那么当它确实使事情同步时,为什么要将其标记为异步呢?

此代码不运行同步。它只是按顺序运行,看起来是同步的。 如果您的函数使用异步方法,则可以将其标记为“async”类型

和“wait”标记异步部分

No,这并不意味着同步运行 和是语法上的糖。这意味着该语法相当于ES2015和ES2016中的以下语法,将a作为一个

简单地说,只有在遇到第一个wait表达式之前的所有内容都是同步运行的。这是由于承诺构造函数的executor中的_nextundefined调用造成的

之后,函数将向调用方返回一个承诺,当函数的执行到达其控制流的末尾时,该承诺将得到解决

连续遇到的等待表达式之间的每个块都在其自身的异步继续中运行。然后

协同程序的目的是在生成器中遇到的每个表达式上运行。当承诺解决时,协程在同一点异步重新进入控制流,提供已解决的值或抛出拒绝的原因。Promise.resolvevalue.then_next,_throw就是这个的作用


通过对async/await的本机支持,协同路由所做的一切实际上都是在运行时的事件循环中实现的。

async并不意味着它是同步的。但是wait的意思是你想等待操作的结果。如果您包含所有正在使用的术语,而不仅仅是一个术语,那么语义会更清楚。@David:为什么要将匿名函数标记为async以使用await,哪一部分变为async?async只是承诺的糖衣。它是异步的,但以同步方式编写。把每一次等待想象成一次回访/承诺ṛ̖e̬̦t̸͉̥̳̼:函数标记为异步,因为它是异步操作。您可以选择是否等待操作。当您调用异步操作时,它是异步执行的。当您等待该操作时,您会等待其结果。那么标记为async的函数将被安排在主线程完成其同步作业后运行?那就是你能回答我问题下面最后的评论吗?我没有否决你的回答谢谢你的好意。
someReceiveACallback('event', coroutine(function*() {
  const result = yield imAsync(); /*1*/
  let anotherResult = null; /*2*/
  if (result.authenticated)
    anotherResult = yield imAlsoAsync(); /*3*/
  send(anotherResult); /*4*/
}));

function coroutine(fn) {
  return function() {
    return new Promise((resolve, reject) => {
      const gen = fn.apply(this, arguments);
      const step = method => result => {
        try {
          var { value, done } = gen[method](result);
        } catch (error) {
          reject(error);
          return;
        }

        if (done) resolve(value);
        else Promise.resolve(value).then(_next, _throw);
      };

      const _next = step('next');
      const _throw = step('throw');

      _next(undefined);
    });
  };
}