Generator 函数是 ES6 提供的一种异步编程解决方案,但试验结果为什么不符合预期呢

myepoch 2017-04-20 03:49:34
Generator 函数是 ES6 提供的一种异步编程解决方案

参考文章 http://www.ruanyifeng.com/blog/2015/04/generator.html,提到
yield表示执行到此处,执行权将交给其他协程。也就是说,yield命令是异步两个阶段的分界线。
协程遇到 yield 命令就暂停,等到执行权返回,再从暂停的地方继续往后执行。它的最大优点,就是代码的写法非常像同步操作,如果去除yield命令,简直一模一样。

但是我node test.js ,同时也在web中试验了。

期望返回结果顺序是 1111,222222,33333但是实际返回结果顺序是1111,33333,2222



function step1(){
for(let n=0;n<1000000000;n++){}
return;
}
function* Foo() {
console.log("111111111111")
yield step1();
console.log("333333333333")
}

var foo = Foo();
foo.next();
foo.next();

console.log("2222222222222");
...全文
248 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
似梦飞花 2017-04-21
  • 打赏
  • 举报
回复
引用 10 楼 myepoch 的回复:
有人解释下 <span style="color: #FF0000;">//他是异步解决的一个方案 但不是异步执行 </span> <span style="color: #0000FF;">这话如何理解呢???</span>
我也不知道这样说严不严谨 你可以自己找些基础的书看看
myepoch 2017-04-21
  • 打赏
  • 举报
回复
有人解释下 <span style="color: #FF0000;">//他是异步解决的一个方案 但不是异步执行 </span> <span style="color: #0000FF;">这话如何理解呢???</span>
myepoch 2017-04-20
  • 打赏
  • 举报
回复

//yield语句后面的表达式或函数,将在阻断之前执行完毕。
//他是异步解决的一个方案 但不是异步执行	 这话如何理解呢???
//就是多次next中间可以执行别的代码 而generator中的代码一直停留在上次执行的地方  
//再次next的时候接着上次代码的部分继续执行
function step1(){			
	console.log('222222:A执行一半,假设IO读取文件');			
	return 'a';
}

function step2(){
	console.log('555555:A恢复执行,处理文件');
	return 'b';
}

function* Foo() {
	console.log("111111:A准备开始执行")
	yield step1();//读取文件
	console.log("444444:B交还执行权")
    yield step2();//处理文件		
}

var foo = Foo();
foo.next();	
console.log("333333:B获取了执行权");
foo.next();	
//console.log("2222222222222");//此时的上下文刚刚执行到这里
myepoch 2017-04-20
  • 打赏
  • 举报
回复
引用 6 楼 zzgzzg00 的回复:
因为你又接着执行next了啊 这样 var foo = Foo(); foo.next(); console.log("2222222222222"); foo.next(); 他是异步解决的一个方案 但不是异步执行
我好想明白点了,但“他是异步解决的一个方案 但不是异步执行“。这句话怎么理解呢
bigbird_561 2017-04-20
  • 打赏
  • 举报
回复

var foo = Foo();
        foo.next();   //此时打印111,Foo()中执行到了这一步,之后Foo中你可以理解为存了一个标记位
        foo.next();   //此时打印333,继续执行Foo()中标记位后续的代码,如果不调用next,标记位置保持不变
        console.log("2222222222222");//此时的上下文刚刚执行到这里
似梦飞花 2017-04-20
  • 打赏
  • 举报
回复
因为你又接着执行next了啊 这样 var foo = Foo(); foo.next(); console.log("2222222222222"); foo.next(); 他是异步解决的一个方案 但不是异步执行
myepoch 2017-04-20
  • 打赏
  • 举报
回复
引用 1 楼 myepoch 的回复:
有人知道吗,实在理解不了。
//333在111之后打出我理解,但为什么222会在333之后才打出呢。预期在111之后打印啊
似梦飞花 2017-04-20
  • 打赏
  • 举报
回复
对 就是多次next中间可以执行别的代码 而generator中的代码一直停留在上次执行的地方 再次next的时候接着上次代码的部分继续执行
myepoch 2017-04-20
  • 打赏
  • 举报
回复
引用 2 楼 zzgzzg00 的回复:

       function step1(){
            for(let n=0;n<100;n++){}
            return;
        }
        function* Foo() {
            console.log("111111111111")
            yield step1();
            console.log("333333333333")
        }

        var foo = Foo();
        foo.next();
        console.log("2222222222222");
        foo.next();
你就把他看做return yield完之后直到下一次next才会执行之后的代码 没执行一次yied暂停执行之后的代码 中间你可以执行其他代码 再次next的时候接着上次执行的地方往下执 行
中间可以执行其他代码,所以按照预想应该是执行222222,然后再执行33333啊
似梦飞花 2017-04-20
  • 打赏
  • 举报
回复

function step1(){
            for(let n=0;n<100;n++){}
            return;
        }
        function* Foo() {
            console.log("111111111111")
            yield step1();
            console.log("333333333333")
        }

        var foo = Foo();
        foo.next();
        console.log("2222222222222");
        foo.next();
你就把他看做return yield完之后直到下一次next才会执行之后的代码 没执行一次yied暂停执行之后的代码 中间你可以执行其他代码 再次next的时候接着上次执行的地方往下执行
myepoch 2017-04-20
  • 打赏
  • 举报
回复
有人知道吗,实在理解不了。

87,993

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧