当被调用的方法内部有另一个调用时,客户端中的Meteor.call不会等待

时间:2018-03-20 11:58:20

标签: meteor async-await

我关注的是我使用Meteor.call的标准方式,但在这种情况下它表现得很奇怪:

客户端:

Template.sometemplate.events({
    'submit .somebutton'(event){
         ...
         Meteor.call('stuff.someMethod', param1, function (err, res){
              console.log(err);
              console.log(res);
         };
    }
})

服务器/api/stuff.js:

Meteor.methods({
    'stuff.someMethod'(param1){
         ...
         Meteor.call('otherstuff.someOtherMethod', param1, function(err, res){
                  if(err){ throw new Meteor.Error(400,'wrong things');}
                  if(res) { return 'ok';}
             }
         );
    }
})

服务器/api/otherstuff.js:

Meteor.methods({
    'otherstuff.someOtherMethod'(param1){
         ...
         return OtherStuff.findOne(query);
    }
})

在客户端,我单击并立即查看console.log,将err和res视为未定义。在应用程序的其他部分,当客户端调用服务器方法而不调用另一个方法时,客户端在执行异步回调之前等待答案。

在调用另一个服务器方法的服务器方法中使用Meteor.call的方式肯定有问题。场景是,例如我想插入一个文档,同时这样做我想检查一些值,以便将它链接到其他集合中的其他文档。

非常感谢, 吨。

1 个答案:

答案 0 :(得分:3)

在服务器上同步呼叫

在服务器上使用Meteor.call不需要回调,除非你真的想在服务器端工作异步。

  

如果未在服务器上传递回调,则调用方法   将阻止,直到方法完成。它最终会回归   返回方法的值,否则会抛出异常   方法抛出异常。 (如果是,可能映射到500服务器错误   异常发生在远程,它不是Meteor.Error异常。)

您可以返回结果

,而不是传递回调
 [object Object] undefined bob Hello bob

或将其分配给用于进一步处理的变量。

return Meteor.call(...)


更好的方法:外化共享代码

如果两个流星方法依赖于相同的代码(例如,一个调用另一个),则应将此代码提取到共享函数中。这使得测试和跟踪错误也更容易。

服务器/ API / common.js

const retVal = Meteor.call(...)

服务器/ API / stuff.js:

export const sharedFunction = function(param1) {
    // ... do somethin
    return OtherStuff.findOne(query); 
}

服务器/ API / otherstuff.js

import { sharedFunction } from './common.js';

Meteor.methods({
    'stuff.someMethod'(param1){
         // ...
         const temp = sharedFunction(param1);
         // ...
         return result; // or temp if this should be returned to client
    }
})

使用import { sharedFunction } from './common.js'; Meteor.methods({ 'otherstuff.someOtherMethod'(param1){ return sharedFunction(param1); } }); 遵循DRYSingle Point of Failure的概念。