generator的next传参注意点

1. 返回多个结果:
一般一个函数只能返回一个结果,generator可以使得函数返回多个结果。
用法:function*定义,函数中可以用return语句,可以用yield返回多次。

function* foo(x) {
    yield x + 1;
    yield x + 2;
    return x + 3;
}

foo(1) //表示创建了一个generator对象,但是还没有执行,若要执行则如下写

var a=foo(1); //表示创建了一个generator对象并且赋值给了变量a
a.next(); //表示调用执行generator对象。
注意:如果generator函数里返回值有三个,那么调用一次返回第一次结果,调用两次返回第二次结果,调用第三次返回第三次结果,再调用就会是undefined。打印的结果是按照yield语句声明的顺序进行的

返回情况如下:
在这里插入图片描述
{value:2,done:false/true} value是yield返回的值,done表示generator是否已经执行完毕,false表示没有执行完,true表示已经执行完毕。

2. 异步代码执行
书写的时候可以将异步代码变为书写时的“同步样式”的代码。

例子如下:

function* G() {
    const a = yield 100
    console.log('a', a)  // a aaa
    const b = yield 200
    console.log('b', b)  // b bbb
    const c = yield 300
    console.log('c', c)  // c ccc
}
const g = G()
g.next()    // value: 100, done: false
g.next('aaa') // a aaa   value: 200, done: false   
g.next('bbb') //   b bbb  value: 300, done: false
g.next('ccc') //c ccc  value: undefined, done: true

console输出语句为a aaa/b bbb/ c ccc/
原因:第一句g.next()执行了yield100;第二句g.next(‘aaa’)中的参数赋值给了第一个yield前面的变量,即a。然后再输出console.log(‘a’, a) // 此时的a值为 aaa。然后执行了yield200,再赋值给b=bbb。
若没有g.next();那么输出的语句就不一样了,看下面的实例

const g = G()
g.next('aaa')   //此时的语句执行后的结果为{value: 100, done: false}
g.next('bbb')   //{value: 200, done: false}
g.next('ccc')    //{value: 300, done: false}

那么console的输出结果呢?a bbb / b ccc
原因:第一句为g.next(‘aaa’),这句之前没有执行yield,所以即使带参数也不会赋值,在g.next(‘bbb’)时,会将bbb赋值给a然后执行console.log(a);next参数只赋值给已经执行完毕的yield语句左边的变量

在Python 3.x中,生成器对象(generator object)不再有next()方法,而是使用__next__()方法来获取下一个元素。所以在你的代码中,应该使用g.__next__()来获取生成器的下一个元素。这个错误提示是因为你在使用g.next()时,生成器对象没有next()属性,导致AttributeError异常的出现。如果你想要通过next()方法访问生成器对象,可以使用内置的next()函数,即next(g)。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [python 2.x 错误 ‘generator’ object has no attribute ‘_F_hawk189_新浪博客](https://blog.csdn.net/F_hawk189/article/details/109652603)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [Python错误:AttributeError: 'generator' object has no attribute 'next'解决办法](https://blog.csdn.net/gaifuxi9518/article/details/81059938)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [mybatis generator 自动生成 dao mapping object](https://download.csdn.net/download/knight_black_bob/9773699)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值