Any way to exports a generator function?
Asked Answered
D

3

19

An example

generator.js:

exports.read = function *(){
  var a = yield read('co.github.js');
  var b = yield read('co.recevier.js');
  var c = yield read('co.yield.js');
  console.log([a,b,c]);
}

function read(file) {
  return function(fn){
    fs.readFile(file, 'utf8', fn);
  }
}

co.js:

var co = require('co');
var fs = require('fs');
var gen = require('./generator')
/*function read(file) {
  return function(fn){
    fs.readFile(file, 'utf8', fn);
  }
}*/

co(gen.read)()

It seems that exports doesn't support generator function.

require, module, __filename, __dirname) { module.exports.read = function *(){
                                                                          ^
SyntaxError: Unexpected token *
at exports.runInThisContext (vm.js:69:16)
    at Module._compile (module.js:432:25)
    at Object.Module._extensions..js (module.js:467:10)
    at Module.load (module.js:349:32)
    at Function.Module._load (module.js:305:12)
    at Function.Module.runMain (module.js:490:10)
    at startup (node.js:123:16)
    at node.js:1027:3

Why I want to do this? I just want to separate my data from Controllers. Any way to solve it?

Durr answered 24/6, 2014 at 13:55 Comment(5)
Isn't that error saying something else?Hectogram
Nope. It seems the require in node doesn't support generator.Durr
What's the * in the function definition? It's invalid javascript - which is what the error is complaining aboutHindenburg
It's generator function defined in ES6. V8 has supported it.Durr
Are you using --harmony flag?Celluloid
E
5

You can use a variable to store it, and export it afterwards :

var myGenerator = function *() {
    // ...
}

module.exports = myGenerator;

In another file, then, you can require it :

var myGen = require('./myfirstfile.js');
// myGen is now myGenerator from above
Epigeous answered 22/1, 2016 at 10:46 Comment(0)
R
2

you can export whatever you want, but please do not export generator functions in public modules. generators are control flow hacks. instead, return promises with co@4

exports.fn = co.wrap(function* () {
  return yield something() 
}
Raeannraeburn answered 7/12, 2014 at 3:50 Comment(0)
F
0

This could be the issue:

NodeJS console SyntaxError: Unexpected token * for generator

Furthermore, I would not export anything that is not an object, specially in ES6 having classes at your disposal.

Farther answered 13/7, 2016 at 18:15 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.