【问题标题】:Meteor method not returning return value when return wrapped in a callback当返回包装在回调中时,Meteor方法不返回返回值
【发布时间】:2012-05-11 07:34:15
【问题描述】:

当我将返回包装在回调中时,我无法让服务器 Meteor.method 返回成功的响应。

当不包含在回调中时它可以正常工作。

它可以在包含在回调中和未包含在回调中时抛出新的 Meteor.errors。

以完全相同的方式在客户端包装 Meteor.call 可以正常工作。

但是,由于某种原因,在服务器上执行此操作时调用 return 时不会返回响应值。

这是一个例子。这不是我的确切代码,但非常接近。不过距离很近。

Meteor.methods({
  insertData: insertData
});

function insertData(params){
 validateParams(params, function(bool, msg){
  if(bool){
    //do stuff, like insert records
    result = 'thanks a million gagillions';
    console.log(result);
    return result;
  } else {
    throw new Meteor.Error(513, msg);
  }
 });
}

validateParams(params, callback){
  for (var key in params) {
    value = params[key];
    if(_.isEmpty(value) || _.isUndefined(value) || _.isNull(value)) {
      callback(false, 'Please enter your "'+ key + '".'); 
      return;
    }
  }
  callback(true);
}

如何让它工作以返回结果?

【问题讨论】:

    标签: javascript meteor


    【解决方案1】:

    您的问题是返回语句属于您传递给validateParams 的函数。它不属于insertData函数。

    如果拆分代码部分,您可以更好地看到这一点:

    function insertFunc(bool, msg) {
      // do your work
      return result;
    }
    
    function insertData(params) {
      validateParams(params, insertFunc);
      // no return statement..
    }
    

    需要在validateParams中传播回调的返回值:

    validateParams(params, callback){
      for (var key in params) {
        value = params[key];
        if(_.isEmpty(value) || _.isUndefined(value) || _.isNull(value)) {
          return callback(false, 'Please enter your "'+ key + '".');  // <----- here
        }
      }
      return callback(true); // <---- and here
    }
    

    然后在你的函数中返回validateParams的结果:

    function insertData(params){
      return validateParams(params, function(bool, msg) {
        // your code..
      });
    }
    

    注意:抛出异常是有效的,因为它们会一直传播到到达 try/catch 块为止。

    【讨论】:

    • 这也适用于为想要使用回调的人解决解决方案。
    【解决方案2】:

    这里不需要回调。您可能会发现直线代码更具可读性。

    Meteor.methods({
      insertData: insertData
    });
    
    function insertData(params){
      // run validator, allow exception to propagate
      validateParams(params);
    
      //do stuff, like insert records
      result = 'thanks a million gagillions';
      console.log(result);
      return result;
    }
    
    function validateParams(params){
      for (var key in params) {
        value = params[key];
        if(_.isEmpty(value) || _.isUndefined(value) || _.isNull(value))
          throw new Meteor.Error('Please enter your "'+ key + '".');
      }
      // not strictly necessary, just don't throw exception.
      return true;
    }
    

    【讨论】:

    • 这很好用。给别人小费。如果您调用从客户端抛出新 Meteor.Error 的共享函数,请将其包装在 try catch 中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 2021-11-25
    • 2014-10-30
    • 1970-01-01
    • 1970-01-01
    • 2012-11-26
    • 1970-01-01
    相关资源
    最近更新 更多