添加 promise return 支持以保存操作,当前返回 undefined。 根据需要更新的验证和保存状态,有多个返回路径。 这将允许使用 .then() 链接多个保存操作而不是嵌套。
我将此添加到 4.x 的列表中。 与中间件的实现方式有关(hooks.js)。
太好了,谢谢。 我已经为我的项目实现了一个 jquery 的 .when 作为 mongoose Promise 对象的扩展。 你有兴趣提出拉取请求吗?
var p1 = Users.find();
var p2 = Animals.find();
Promise.when(p1, p2).addBack(function(err, users, animals) {
//等等
});
不用了,谢谢。 我真的不想添加更多可以在猫鼬之外实现的功能。 它已经肿了。
对于找到此线程的其他人,这里是: https ://github.com/wshaver/mongoosewhen
@wshaver将其发布到 npm 并添加一个 mongoose 标记,以便它显示在http://plugins.mongoosejs.com上
移至此处以符合其他 Mongoose 插件在名称中使用破折号: https ://github.com/wshaver/mongoose-when
发布到 npm,标记。 还没有出现,但可能有延迟。
@wshaver很酷。 它每天更新一次。
在深入研究#1446 之后,我想我可以在不删除“hooks.js”的情况下实现这一目标。
绿灯?
大胆试试吧
2013 年 10 月 7 日,星期一,Refael Ackermann 写道:
在深入研究#1446 https://github.com/LearnBoost/mongoose/issues/1446之后,我想我可以在不删除“hooks.js”的情况下实现这一点。
绿灯?—
直接回复此邮件或在 Gi tHub上查看 https://github.com/LearnBoost/mongoose/issues/1431#issuecomment -25792310
.
亚伦
@aaronheckmann https://twitter.com/#!/aaronheckmann
soundcloud.com/ajhecky
github.com/aheckmann
大公关准备就绪
这对我也很有帮助。 应该可以调用 myDoc.save().exec() - 所以基本上 save 应该返回一个可以执行的查询。 或者是什么原因,Save 不返回查询?
如果我们省略回调,则 +1 承诺返回
该修复程序位于master
分支中,计划包含在 3.10 中。
这是否包括模型创建操作的返回承诺?
@GDownes create()
已经返回一个承诺:) http://mongoosejs.com/docs/api.html#model_Model.create
3.10 的任何计划发布日期? :)
@swayf 4.0 还需要几个月的时间。 我在沙滩上的路线是 9 月 2 日,但希望在那之前:)
这是否仍安排在即将发布的版本中?
是的,这将是 4.0,但是,仍然没有发布日期。 最后的估计不太对:(
:+1:
+1 因为:
我需要在钩子之前在 mocha 测试中保存 2 个文档,并且此功能将允许我在保存两个模型后执行done()
回调。
我尝试使用Collection.insert([docs], done)
方法,但它不会触发我需要散列一些值的Schema.pre('save')
逻辑。
@arathael ,您始终可以使用异步模块将两个文档保存在async.parallel
中并在回调中执行完成
谢谢大佬,我现在正在测试。 我刚刚加入,因为我认为来自 ODM 的本地支持会动摇。
+1
我使用 6to5 的实验性 ES7 等待/异步。 如果 record.save() 返回了一个承诺,我可以这样做:
try {
await record.save()
} catch(err) {
...
}
现在我正在这样做:
userSchema.methods.saveAsync = function() {
return new Promise((resolve,reject) => {
this.save((err) => {
if(err) return reject(err)
resolve()
})
})
}
+1 为@aaronshaf ,对我很有用,我也会在 ES5 中为那些不使用 ES6 的人编写它。 谢谢
这是我现在所做的。 显然 Q 不是必需的,但这是我在其他地方用于承诺的。
/*
* Hack until mongoose 3.10 comes out. See this: https://github.com/LearnBoost/mongoose/issues/1431
*/
mongoose.Document.prototype.savePromise = function () {
var that = this;
return Q.Promise(function(resolve, reject) {
that.save(function (err, item, numberAffected) {
if (err) {
reject(err);
}
resolve(item, numberAffected);
});
});
};
mongoose.Document.prototype.removePromise = function () {
var that = this;
return Q.Promise(function(resolve, reject) {
that.remove(function (err, item) {
if (err) {
reject(err);
}
resolve(item);
});
});
};
+1 hack @jhullfly但是我认为 Q 的解决方案只需要一个参数,因此 numberAffected 被删除,需要将它们放在一个数组或其他东西中才能访问两者:
mongoose.Document.prototype.savePromise = function () {
var that = this;
return Q.Promise(function(resolve, reject) {
that.save(function (err, item, numberAffected) {
if (err) {
reject(err);
}
resolve([item, numberAffected]);
});
});
};
1+ 承诺从保存中返回!
现在save
在 4.0.1 中返回承诺。 干杯。
+1
@arathael +1
是否有与如何将save
与 Promises 一起使用的文档?
我尝试了以下方法,但似乎没有用:
var User = mongoose.model('User');
var u = new User();
u.save().then(function() {
// never gets here.
});
// I even tried the following, and neither works.
u.save().then(function() {}).end();
你在 mongoose 4.0.1 上,你 npm 安装了吗?
@Ouwen是的,我正在运行 4.0.1,是的,我运行了,否则如果未安装 mongoose,我会收到错误消息。
问题是then
似乎永远不会被调用。 我很确定我在做一些奇怪的事情(否则会很快提交错误),但我无法推理,这就是我很想知道是否有任何示例/文档围绕它。
嗯,很奇怪。 我知道我正在运行 3.8.8 并且忘记了 npm install 将其升级到 4.0.1 这就是为什么没有从 u.save() 返回承诺
你所写的应该有效。
@limianwang您是否成功连接到 mongodb 服务器? 你能给我一个独立的例子来重现这个吗?
.save() 返回的 promise 对象似乎与其他 promise 不同,它具有 catch/caught 而不是 onReject。
猫鼬 4.1.10 和...
var u = new User();
u.save().then(...)
仍然不返回承诺
@xrado请提供一个更实质性的例子。 我们已经进行了测试以表明它应该在 mongoose 4.1.10 中工作。
@vkarpov15我的错,我又试了一次并且可以工作..我不知道我之前在做什么..对不起
我有同样的问题,Save 立即将数据保存到数据库中,并且不调用 then 中的代码。 奇怪的是,我有另一个代码和平,确实调用了 then 块并且承诺有效。
代码( user.save() 部分保存它,然后未定义但从未调用)
user.save().then( function(userX) { // 保存作品
控制台.log(2); // 这没有被调用
}).end() // 未调用
.then(未定义,函数(错误){
console.log('err:' + err ); // 未调用
});
更新我使用了旧方法,它的工作方式如下:
user.save(function (err, newuser) {
if (err) console.log('err=' + err);
console.log('用户已保存');
});
然后 user.save().then( function(userX) { // 保存作品
控制台.log(2);
})。结尾()
.then(未定义,函数(错误){
console.log('err:' + err );
});
作品!!!!!!!!!!! 甜的....
@nickjohngray很高兴你明白了 :) 我强烈建议你在继续使用 mongoose 的 Promise 之前阅读文档上的 Promise 指南——别担心,它只是简短的阅读。
我有同样的问题......我真的希望我不必为了在承诺中工作而降级整个主要版本。
@jhyland87请提供代码示例,以便我了解问题所在。
@vkarpov15我做到了,在票里
这是在另一张票中修复的......
基本上,这段代码:
var User = mongoose.model('User');
var u = new User();
u.save().then(function() {
// never gets here.
});
保存文档时只需要添加return
.. 所以:
var User = mongoose.model('User');
var u = new User();
return u.save().then(function() {
// never gets here.
});
@jhyland87 ,仅供参考 -与 Mongoose 链接承诺的另一个示例。
这仍然是一个问题吗?
我有以下代码(使用 TypeScript)...
User.findById(id)
.exec()
.then((user) => {
user.name = 'new name from wherever!';
return user.save();
})
.then((user) => {
// want to do more stuff with the user object once it has been saved successfully...
// ... but it never makes it here!!!
};
但是,当我向save()
函数添加一个空回调时,一切似乎都很好,如下所示......
User.findById(id)
.exec()
.then((user) => {
user.name = 'new name from wherever!';
return user.save(() => {
// unwanted empty callback... hmmm?
});
})
.then((user) => {
// we made it here!!! but now...
// user === undefined :(
};
你在使用承诺吗? 尝试切换到mongoose.Promise = global.Promise;
最有用的评论
现在我正在这样做: