我正在尝试从构造函数中调用类中的生成器函数,它运行但没有任何反应(我的console.log没有打印),好像永远不会调用生成器函数。
这是我的代码的更新版本。我可以使用next()函数访问我的findOne函数,但是因为我包装了#34;用户"与合作僧侣,我很难在没有必要打电话给它。我还不确定为什么我需要调用next(0)函数2次才能跳过yield调用。
因此,当我打印" userData"的输出时,我现在变得未定义。
如果我的问题与了解收益率如何运作有关,也许指点我的方向可以帮助我。我尝试使用生成器函数和除了类之外的yield调用,它与monk / co-monk完美配合。
我还应该提到我使用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;
答案 0 :(得分:3)
看起来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"})
对象可能不会立即填充。
答案 1 :(得分:0)
尝试使用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);
});
};
}