Meteor.apply() 仅在订阅数据时返回结果

问题描述 投票:0回答:1

在我的 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) {
包装这些方法,但不起作用。

reactjs meteor
1个回答
0
投票

使用

Meteor.call
Meteor.apply
时对服务器的底层请求是异步的;但是该函数本身是同步运行的。这意味着返回的值只有在本地 MiniMongo 集合中已经存在的情况下才是您所寻求的值。回调当然将包含您期望的结果,因为一旦收到服务器响应就会调用它。

好消息是,最近版本的meteor(我相信> 2.8)现在有一个基于承诺的

Meteor.callAsync
Meteor.applyAsync
,它们是可等待的并且应该按照你期望的方式工作。

const userprice = await Meteor.callAsync('decorations.getOne', id);
© www.soinside.com 2019 - 2024. All rights reserved.