- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我对 promise 很陌生,想知道为什么以下内容不起作用。我之所以这么假设,是因为我需要以特定的方式设置自定义方法来使用 Promise。
我使用 bluebird 作为我的 Promise 库。我试图通过在这些各自的模型(即讨论和用户模型)上使用 Mongoose 静态和方法来获取给定“用户”用户名的“讨论”对象列表。
下面是我在 Express 中的请求处理程序。现在只是尝试获取 JSON 并将其作为响应发送:
/* /routes/users.js */
var Promise = require('bluebird');
var User = require('../models/').User
/* ... express inclusions, other routes ... */
/* Get list of discussions for user */
router.get('/:username/discussions', function(req, res) {
User.findOne({username: req.params.username}).then(function(user) {
if (user) {
return user.getDiscussions();
} else {
res.send('no user found');
}
}).then(function(discussions) {
res.send(discussions);
}).catch(function(error) {
console.log('ERROR: ' + error);
res.send('ERROR: ' + error);
});
});
下面是 user.getDiscussions():
/* /models/user.js */
var Promise = require('bluebird');
var mongoose = Promise.promisifyAll(require('mongoose'));
var Discussion = require('./discussion').Discussion;
var Schema = mongoose.Schema;
/* ... UserSchema defined here ... */
UserSchema.methods.getDiscussions = Promise.method(function() {
var self = this;
self.model('User').findById(self.id).then(function(user) {
if (!user) {
Promise.reject('User \'' + self.id + '\' does not exist.');
} else {
return Discussion.getDiscussionsForUser(self.username);
}
});
});
最后,Discussion.getDiscussionsForUser:
/* /models/discussion.js */
var Promise = require('bluebird');
var mongoose = Promise.promisifyAll(require('mongoose'));
var Schema = mongoose.Schema;
/* ... DiscussionSchema defined here ... */
DiscussionSchema.statics.getDiscussionsForUser = Promise.method(function(username) {
var self = this;
self.model('User').findOne({username: username}, 'discussions').then(function(user) {
if (!user) {
return Promise.reject('User with username \'' + username + '\' does not exist.');
} else {
var discussions = [];
return self.model('Discussion').find({
'_id': { $in : user.discussions }
});
}
});
});
看来路由中的请求提前完成并在响应中发送未定义的内容。知道为什么讨论模型中从 Mongoose 获得的讨论没有冒泡到路由吗?
最佳答案
getDiscussions()
和 getDiscussionsForUser()
未正确返回 promise 。按如下方式更改它们:
UserSchema.methods.getDiscussions = Promise.method(function() {
var self = this;
// *** added a return to this next line
return self.model('User').findById(self.id).then(function(user) {
if (!user) {
// *** added a return to this next line
return Promise.reject('User \'' + self.id + '\' does not exist.');
} else {
return Discussion.getDiscussionsForUser(self.username);
}
});
});
与 getDiscussionsForUser()
相同,应该是这样的:
DiscussionSchema.statics.getDiscussionsForUser = Promise.method(function(username) {
var self = this;
// *** added a return to the next line
return self.model('User').findOne({username: username}, 'discussions').then(function(user) {
if (!user) {
return Promise.reject('User with username \'' + username + '\' does not exist.');
} else {
var discussions = [];
return self.model('Discussion').find({
'_id': { $in : user.discussions }
});
}
});
});
为了使调用者能够使用 Promise 协调函数内异步操作的完成,通过该函数的所有代码路径必须始终从该函数返回 Promise。进入 .then()
处理程序后,如果存在进一步嵌套的异步操作,则必须返回一个 Promise,或者如果您希望该值成为您所在 Promise 的值,则可以只返回一个值。
关于node.js - Bluebird promise 乘坐快车/ Mongoose 返回太早,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35672808/
复制代码 代码如下: <?php function Download() { $urlodd=explode('//',$_P
复制一下代码,保存为cs.php即可,若要保存为其他名字,注意修改<form action=cs.php method=GET>这一行 复制代码代码如下: <?p
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
不知何故,我收到 mongo 错误发送到前端,我期望只发送我从 throw new Error('Database failed to save'); { try { const
Node Express 文档给出了 hello-world example : var express = require('express') var app = express() app.ge
所以我遇到了一个问题,我的一些 express.js (v3.2.0) 路由返回 404 状态代码,而其他路由则没有。我不明白为什么有些路线工作正常,而其他路线则无法解决。任何帮助将不胜感激。 服务器
如何确保在 promise 拒绝的情况下仅将我创建的错误消息发送到客户端? 我抛出了一个自定义错误,它工作正常。 return db.query(`SELECT * FROM events WHERE
我是一名优秀的程序员,十分优秀!