2012-05-10 7 views
2

コールバックで戻り値をラップすると、Meteor.methodが正常な応答を返すのに問題があります。メテオールメソッドがコールバックでラップされた戻り値を返さない場合

コールバックでラップされていないと正常に動作します。

コールバックでラップされたときとコールバックでラップされていないときの両方で、新しいMeteor.errorsをスローすることができます。

この全く同じ方法でMeteor.callをクライアント側にラップすると問題はありません。

しかし、サーバー上で何らかの理由でこれを行うと、戻り値が呼び出されたときに応答値が返されません。

ここは例です。これは私の正確なコードではありませんが、非常に近いです。それは非常に近いですが。

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

結果を返すにはどうすればよいですか?

答えて

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

これはうまくいった。他の人にヒント。クライアント側から新しいMeteor.Errorをスローする共有関数を呼び出す場合は、try catchでラップしてください。 –

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ブロックに達するまでこれらの例外が伝播されるため、例外が動作します。

+0

これは、コールバックを使用したい人のための解決策を解決するためにも機能します。 –

関連する問題