Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 通过该代码的控制流是什么?_Javascript - Fatal编程技术网

Javascript 通过该代码的控制流是什么?

Javascript 通过该代码的控制流是什么?,javascript,Javascript,下面的代码是的,我知道它不是惯用的打印1,2。但我希望它能打印2,1 异步=>{ 让我们下决心; 新Promiser=>{ 解析=r }.then=>console.log'1' 等待解决; 控制台。日志'2' } 问题似乎在于wait的用法。当遇到关键字时,JavaScript解释器将立即暂停函数的其余部分,并仅在承诺得到解决后恢复其余的执行。如果您等待nonPromiseValue,它将被视为您通过创建它,并且本质上等同于 允诺,不允诺价值 .thenresolvedValue=>{ 解析

下面的代码是的,我知道它不是惯用的打印1,2。但我希望它能打印2,1

异步=>{ 让我们下决心; 新Promiser=>{ 解析=r }.then=>console.log'1' 等待解决; 控制台。日志'2'
} 问题似乎在于wait的用法。当遇到关键字时,JavaScript解释器将立即暂停函数的其余部分,并仅在承诺得到解决后恢复其余的执行。如果您等待nonPromiseValue,它将被视为您通过创建它,并且本质上等同于

允诺,不允诺价值 .thenresolvedValue=>{ 解析值; } 或者更一般地说:

await <await expression>;

<rest of body>;

return <return expression>;

下面的代码演示了如何将等待后的代码视为微任务,类似于then

启动一个紧密的间接递归微任务循环,将前五个整数打印到控制台

异步函数是同步调用的。等待之后,foo2中的字符串被打印到控制台

我包括了一个发电机功能来提醒我们它们是同步的

异步迭代器包括完整性

注意与then任务的交错

函数printNums{ 设计数器=0 函数go{ 控制台.日志计数器++ 如果计数器<5 Promise.resolve.thengo } 答应,决心,然后走 } 印刷品 异步函数foo{ 控制台。记录“内部foo 1” 等待1 控制台。记录“内部foo 2” } requestAnimationFrame=>console.log'raf complete'/~16ms setTimeout=>console.log'macrotask complete'//~4ms console.log'synch' 常量可同步={ *[符号.迭代器]{ console.log'starting sync iterable' 产生‘a’ 收益率“b” } } 异步函数printSyncIterable{ 可同步的forlet y{ 主控台 } } 打印可同步 foo.then=>console.log'done' 常量asyncIterable={ 异步*[符号.异步迭代器]{ console.log'starting async iterable' 屈服'⛱'
yield'await将暂停函数的执行,直到承诺得到解决,然后恢复函数。您可以查看生成器workresolve如何返回非承诺,但未定义。@Ben Unrelated.await将始终暂停执行。@VLAZ-直到承诺得到解决。@Ben yes.await;;更改为类似于return new Promiseresolve=>{;resolve}.你知道-基本上代码的其余部分都变成了承诺。等待的表达式是否是承诺并不重要。我假设是为了保持一致性-否则,如果你确实等待foo,它的工作方式会有所不同,这取决于foo是否是承诺。Promise.resolvenonPromiseValue虽然IIRC是同步的。我认为可能是这样的宁愿做一个坚定的人。thennonPromiseValue@Ben重要的一点是,代码的其余部分在.then.中作为一个微任务执行,但我认为您第1段的最后一句需要更改。@Ben OK,试图澄清。我认为您是通过PromiseValue还是Pr来表达它并不重要omise.resolve.then=>nonPromiseValue。在任何一种情况下,都是身体的其余部分被放入微任务队列。引擎将暂停/取消暂停,而不是重新编写函数,但我们可以使用承诺表达相同的语义。因此,它近似于幕后发生的事情。希望足够接近illustra我不喜欢这种行为。
Promise.resolve(<await expression>)
  .then(resolvedValue => {
     resolvedValue();

     <rest of body>;

     return <return expression>;
  });