【问题标题】:Use generator function with yield inside a class in ES2015 using KoaJS使用 KoaJS 在 ES2015 中的类中使用带有 yield 的生成器函数
【发布时间】:2016-04-10 23:24:58
【问题描述】:

我正在尝试从构造函数调用类中的生成器函数,它运行但没有任何反应(我的 console.log 没有打印),就好像从未调用过生成器函数一样。

更新 #1:

这是我的代码的更新版本。我可以使用 next() 函数访问我的 findOne 函数,但是因为我用 co-monk 包装了“用户”,所以我很难没有必要调用它。我仍然不确定为什么我需要调用 next(0) 函数 2 次才能跳过 yield 调用。

因此,当我打印“userData”的输出时,我现在变得不确定。

如果我的问题与了解 yield 的工作原理有关,也许为我指明方向可能会对我有所帮助。我尝试将生成器函数与类之外的 yield 调用一起使用,并且它与僧侣/合僧侣一起工作得非常好。

更新 #2:

我还应该提到我正在使用 babel6 进行转录。

"use strict";

var monk = require("monk");
var wrap = require("co-monk");
var db = monk("localhost/test");
var users = wrap(db.get("users"));

class User {

    constructor(user) {
        if (typeof user == "object") {

            var findUser = this.findOne(user.id);
            findUser.next();
            findUser.next();

            if(findUser != null){
                this._user = user;
            }

        }
        else {
            console.error("user parameter is not an oject");
            return false;
        }
    }

    *findOne(id) {

        var userData = yield users.findOne({_id: id});

        console.log(userData); // Getting undefined

        this._user = userData;

    };


}

var _user = new User({id : "1234"});
console.log(_user);

export default User;

【问题讨论】:

  • this.findOne*(id); 是语法错误。
  • 我的错,我在发布之前打错了。感谢您指出。

标签: node.js koa monk ecmascript-6


【解决方案1】:

看起来co-monk 的文档有点模糊,但是查看one test it has,它需要在co 中使用。

var co = require("co");

// rest of your code

  findOne(id) {
    return co(function* () {
      var userData = yield users.findOne({_id: id});
      console.log(userData); // Getting undefined
      this._user = userData;
    });
  };

它不允许您将异步代码无缝转换回同步代码,因此this.findOne() 将返回一个承诺。因此,您的User 对象可能不会在调用new User({id : "1234"}) 后立即填充。

【讨论】:

  • 感谢您的友好回复。我最后做了什么,我从课堂中取出了生成器函数,在 findOne 函数中,我从僧侣 db 调用返回了一个承诺。然后,我将生成器函数与来自控制器函数的 yield 调用一起使用到 this.body 响应中。这样干净多了。在这里我为你投票 annnnnnnnnnnnnnd 我的 5 分赏金,因为你是唯一一个回答我的人 ;-) 非常感谢!
【解决方案2】:

尝试使用 lib co 并且它有效。

此时看起来 co-monk 在一个类的生成器函数中被破坏了。

所以这对我有用:

"use strict";

var monk = require("monk");
//var wrap = require("co-monk");
var db = monk("localhost/test");
var users = (db.get("users"));
var co = require('co');

class User {

    constructor(user) {
        if (typeof user == "object") {
            var findUser = this.findOne(user.id);
            this._user = user;
        }
        else {
            console.error("The user params is not an object");
        }
    }

    findOne(id) {

        co(function* () {
            return yield users.findOne({_id: id});
        }).then(function (val) {
            console.log(val);
        }, function (err) {
            console.error(err.stack);
        });

    };
}

【讨论】:

    猜你喜欢
    • 2021-09-05
    • 1970-01-01
    • 2017-08-29
    • 1970-01-01
    • 2021-10-29
    • 2023-03-03
    • 2016-05-04
    • 2021-12-28
    • 2011-11-02
    相关资源
    最近更新 更多