Friday, May 10, 2024
45
rated 0 times [  49] [ 4]  / answers: 1 / hits: 36171  / 8 Years ago, mon, august 29, 2016, 12:00:00

Usually, I write code like this:



//definition
exports.getReply = function * (msg){
//...
return reply;
}
//usage
var msg = yield getReply ('hello');


but how can I write and use a generator in and out of an es6 class? I tried this:



class Reply{
*getReply (msg){
//...
return reply;
}
*otherFun(){
this.getReply(); //`this` seem to have no access to `getReply`
}
}
var Reply = new Reply();
Reply.getReply(); //out of class,how can I get access to `getReply`?


I also tried:



 class Reply{
getReply(){
return function*(msg){
//...
return reply;
}
}
}


All of these two methods seem to be wrong answers. So how can I write generator functions in a class correctly?


More From » ecmascript-6

 Answers
29

Edit: Add more examples.

Your class definition is (almost) correct.The error was in instantiation var Reply = new Reply();. This tries to redefine variable assigned to class name. Also generator function is expected to yield something. I elaborated a little OP code to show working example.




class Reply {
//added for test purpose
constructor(...args) {
this.args = args;
}
* getReply(msg) {
for (let arg in this.args) {
let reply = msg + this.args[arg];
//generator should yield something
yield reply;
}
//next call returns (yields) {done:true,value:undefined}
}
* otherFun() {
yield this.getReply('Nice to meet you '); //yields Generator object
yield this.getReply('See you '); //Yes, this can access
//next call yields {done:true, value:undefined}
}
* evenMore() {
yield* this.getReply('I miss you '); //yields generator result(s)
yield* this.getReply('I miss you even more ');
}
}
//now test what we have
const reply = new Reply('Peter', 'James', 'John');
//let and var here are interchangeable because of Global scope
var r = reply.getReply('Hello ');
var msg = r.next(); //{done:false,value:...}
while (!msg.done) {
console.log(msg.value);
msg = r.next();
}
var other = reply.otherFun();
var o = other.next(); //{done:false,value:Generator}
while (!o.done) {
let gen = o.value;
msg = gen.next();
while (!msg.done) {
console.log(msg.value);
msg = gen.next();
}
o = other.next();
}
var more = reply.evenMore();
msg = more.next();
while (!msg.done) {
console.log(msg.value);
msg = more.next();
}
//update of 1/12/2019
//more examples
for (let r of reply.getReply('for ')) {
console.log(r);
}
for (let r of reply.evenMore()) {
console.log(r);
}
//note that the following doesn't work because of lack of star (*) inside the generator function
for (let r of reply.otherFun()) {
console.log(r);
}




UPDATE 1/12/2019


As suggested by @BugBuddy for..of loop looks even nicer (But doesn't work in all cases). See updated lines in the snippet.


[#60891] Thursday, August 25, 2016, 8 Years  [reply] [flag answer]
Only authorized users can answer the question. Please sign in first, or register a free account.
mireyag

Total Points: 73
Total Questions: 107
Total Answers: 85

Location: Ukraine
Member since Sun, Dec 13, 2020
3 Years ago
mireyag questions
Sun, Aug 15, 21, 00:00, 3 Years ago
Wed, Dec 16, 20, 00:00, 3 Years ago
Tue, Sep 1, 20, 00:00, 4 Years ago
Sun, Jul 5, 20, 00:00, 4 Years ago
;