意外的严格模式保留字 -- yield?Node v0.11,harmony,es6

27

尝试使用基于ES6的新型Mongo node.js ODM(Robe:http://hiddentao.github.io/robe/

出现“unexpected strict mode reserved word”错误。我在这里做错了什么吗?

test0.js

"use strict";
// Random ES6 (works)
{ let a = 'I am declared inside an anonymous block'; }

var Robe = require('robe');

// :(
var db1 = yield Robe.connect('127.0.0.1');

运行它:

C:\TestWS>node --version
v0.11.10

C:\TestWS>node --harmony test0.js

C:\TestWS\test0.js:12
var db1 = yield Robe.connect('127.0.0.1');
          ^^^^^
SyntaxError: Unexpected strict mode reserved word
    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:1031:3
2个回答

23

如果你想要使用生成器以同步方式执行异步操作,你需要这样做:

co(function*() {
    "use strict";

    { let a = 'I am declared inside an anonymous block'; }

    var Robe = require('robe');

    var db1 = yield Robe.connect('127.0.0.1');
})();

你可以在以下地方找到co函数的实现:

严格模式下,你无法在生成器之外使用yield。在非严格模式下,yield将被视为变量标识符,所以在你的情况下也会抛出错误。


太棒了。谢谢你,Alex,这对我来说有点脑残。很有道理。1.) 需要从可迭代对象(即生成器)中实际产生yield 2.) 在能够透明地执行它的东西中使用该生成器(co、Task.js等)。 - Robert Taylor

2
值得一提的是,新版本的co返回/使用Promise而不是thunk。因此,以下是适用于较新版本的co的内容。
var co = require('co');

co(function*() {
    "use strict";

    { let a = 'I am declared inside an anonymous block'; }

    var Robe = require('robe');

    var db1 = yield Robe.connect('127.0.0.1/swot');
    console.log(db1)

    return db1;

}).then(function (value) {
    console.log(value);
}, function (err) {
    console.error(err.stack);
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接