Meteor 方法在返回包装在回调中时不返回返回值

Meteor method not returning return value when return wrapped in a callback

本文关键字:返回 返回值 包装 方法 Meteor 回调      更新时间:2023-09-26

当我将返回包装在回调中时,我无法让服务器 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);
}

如何使其工作以返回结果?

你的问题是 return 语句属于你传递给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 块。

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

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;
}