2

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

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

4

2 回答 2

3

您的问题是 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 块为止。

于 2012-05-10T20:57:33.200 回答
1

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

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;
}
于 2012-05-10T23:34:15.133 回答