当我在回调中包装返回时,我无法获取服务器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);
}
如何让它工作以便返回结果?
答案 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;
}