层层嵌套,结不雅就是如许的漏斗形代码。可能有人想到了新标准中的 Promise,可以改写如下:
漏斗形代码是没了,但代码量本身并没削减若干。Promise 并没能干掉落回调函数。
- let i = 1;
- function next() {
- console.log(i);
- if (++i < 10) {
- setTimeout(next, 1000);
- }
- }
- setTimeout(next, 1000);
因为回调函数的存在,轮回就无法应用。不克不及轮回,那么只能推敲递归了,解法如下:
留意固然写法是递归,但因为 next 函数都是由浏览器调用的,所以实际上并没有递归函数的调用栈构造。
Generator——JavaScript 中的半协程
很多说话都惹人了协程来简化异步编程,JavaScript 也有类似的概念,叫做 Generator。
MDN 上的解释:Generator 是一种可以半途退出之后重入的函数。他们的函数高低文在每次重入后会被保持。简而言之,Generator 与通俗 Function 最大年夜的差别就是:Generator 自身保存前次调用的状况。
举个简单的例子:
- function *gen() {
- yield 1;
- yield 2;
- return 3;
- }
- void function main() {
- var iter = gen();
- console.log(iter.next().value);
- console.log(iter.next().value);
- console.log(iter.next().value);
- }();
你可以应用 for ... of 遍历一个 iterator,例如
- for (var i of gen()) {
- console.log(i);
- }
输出 1 2,最后 return 3 的结不雅不算在内。想用 Generator 的各项生成一个数组也很简单,Array.from(gen()) 或直接用 [...gen()] 即可,生成 [1, 2] 同样不包含最后的 return 3。
Generator 是异步的吗
Generator 也叫半协程(semicoroutine),天然与异步关系匪浅。那么 Generator 是异步的吗?
既是也不是。前面提到,异步是相对的,例如膳绫擎的例子
- function *gen() {
- yield 1;
- yield 2;
- return 3;
- }
- void function main() {
- var iter = gen();
- console.log(iter.next().value);
- console.log(iter.next().value);
- console.log(iter.next().value);
- }();
调用 Generator 函数只会返回一个迭代器,当用户主动调用了 iter.next() 后,这个 Generator 函数才会真正履行。
我们可以很直不雅的看到,gen 的办法体与 main 的办法体在瓜代履行,所以可以肯定的说,gen 相对于 main 是异步履行的。然而此段过程中,全部控制流都没有交回给浏览器,所以说 gen 和 main 相对于浏览器是同步履行的。
用 Generator 简化异步代码
回到最初的问题:
- for (let i = 0; i < 10; ++i) {
推荐阅读
今朝手机等移动设备网站开辟已经有比较好的解决筹划,一种是响应式网站,像笔者博客一样,PC网站就是移动网站,一种是把移动网站和PC网站分开,类似淘宝那样。大年夜网站搜刮引擎优化的角>>>详细阅读
本文标题:JavaScript与异步编程
地址:http://www.17bianji.com/lsqh/36197.html
1/2 1

网友点评
精彩导读
科技快报
品牌展示