Используйте функцию генератора с yield внутри класса в ES2015, используя KoaJS

Я пытаюсь вызвать функцию генератора внутри класса из конструктора, он запускается, но ничего не происходит (мой console.log не печатает), как если бы функция генератора никогда не вызывалась.

Обновление № 1:

Вот обновленная версия моего кода. Я могу получить доступ к своей функции findOne с помощью функции next(), но, поскольку я обернул "пользователей" с помощью co-monk, мне было трудно вызывать ее. Я все еще не уверен, почему мне нужно вызывать функцию next(0) 2 раза, чтобы перепрыгнуть через вызов yield.

Поэтому теперь я получаю неопределенное значение, когда печатаю вывод "userData".

Если моя проблема связана с пониманием того, как работает урожай, возможно, указание мне на направление может помочь мне. Я попытался использовать функции генератора с вызовами yield отдельно от класса, и он отлично работал с monk/co-monk.

Обновление № 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;

2 ответа

Похоже, документы для co-monk немного расплывчаты, но, глядя на один тест, он должен использоваться внутри 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"}),

Попробовал с lib co и все заработало.

Похоже, что в этот момент со-монах сломан внутри функции генератора внутри класса.

так вот что у меня сработало:

"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);
        });

    };
}
Другие вопросы по тегам