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);
});
};
}