Используйте функцию генератора с 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);
});
};
}