在我的 Meteor React 应用程序中,我尝试使用 Meteor 方法简单地从数据库获取数据并在客户端上使用它。据我所知,我使用的方法存在于在服务器和客户端上运行的文件中。创建集合和运行方法的文件位于 myapp/imports/api 中,然后我像这样从 myapp/startup/server/api.js 导入它......
import '../../api/usersettings.js';
据我了解,Meteor.call仅在我在调用本身中使用检索到的数据时才有效。例如...
Meteor.call('decorations.getOne', id, function(error, result) {
//Do something here with result.
});
因此,由于我想返回一个值,将其存储在变量中并在后面的代码中使用它,所以我使用 Meteor.apply 代替。基本上像这样使用它(这样我就可以将结果存储在变量中并在其他地方使用它)。
电话:
var userprice = Meteor.apply('usersettings.getOne', [o.assetCode], {returnStubValue:true, wait:true}, (err,res) => {
if (err) {
console.log(err);
} else {
return res;
}
})
方法
Meteor.methods({
'usersettings.getOne'(assetCode) {
if (!this.userId) {throw new Meteor.Error('Not authorised')};
return Usersettings.findOne({ createdBy: this.userId, assetCode: assetCode});
},
...
我的问题是它似乎只返回一个值 IF Meteor 主动订阅了我正在获取的特定文档。否则返回未定义。
方法不应该在没有订阅的情况下工作吗?我的意思是,如果我不希望数据通过订阅进行反应,我是否可以不使用方法来简单地获取数据并显示它?
我尝试用
if (Meteor.isServer) {
包装这些方法,但不起作用。
使用
Meteor.call
和Meteor.apply
时对服务器的底层请求是异步的;但是该函数本身是同步运行的。这意味着返回的值只有在本地 MiniMongo 集合中已经存在的情况下才是您所寻求的值。回调当然将包含您期望的结果,因为一旦收到服务器响应就会调用它。
好消息是,最近版本的meteor(我相信> 2.8)现在有一个基于承诺的
Meteor.callAsync
和Meteor.applyAsync
,它们是可等待的并且应该按照你期望的方式工作。
const userprice = await Meteor.callAsync('decorations.getOne', id);