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

时间:2012-05-10 20:44:15

标签: javascript meteor

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

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

2 个答案:

答案 0 :(得分: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块之前传播。

答案 1 :(得分: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;
}