Meteor上的错误同步问题

时间:2016-04-12 21:33:39

标签: javascript asynchronous meteor

嘿我在Meteor应用程序上管理我的错误有问题,我搜索了这类事情,我发现了一些关于同步功能的话题,但我可以管理我的问题。在我的客户端,我调用一个方法,我需要先得到结果才能完成。 我的客户方:

onSubmit: function(doc){ // Gestion du formulaire d'inscription
        var error = null;
        var title = doc.title;
        var content = doc.content;

        var formData = {
            title: title,
            content: content
        };
        //get the captcha data
        var captchaData = grecaptcha.getResponse();

        Meteor.call('createCPDM', formData, captchaData, function(err){
            if(err){
                error = new Error("Une erreur s'est produite");
            }
        });

        if(error === null){
            this.done(); // Appelle onSuccess
        }
        else{
            this.done(error); // Appelle onError
        }

        // reset the captcha
        grecaptcha.reset();
        return false;
    },

我的服务器端:

createCPDM: function(formData, captchaData) {
    var ip = "0.0.0.0";
    var verifyCaptchaResponse;

    if (!this.connection.clientAddress) {
        verifyCaptchaResponse = reCAPTCHA.verifyCaptcha(ip, captchaData);
    }
    else {
        verifyCaptchaResponse = reCAPTCHA.verifyCaptcha(this.connection.clientAddress, captchaData);
    }

    if (!verifyCaptchaResponse.success) {
        throw new Meteor.Error('422', 'reCAPTCHA Failed: ' + verifyCaptchaResponse.error);
    } 
    else {
        var CPDMID = CPDM.insert(formData);
    }

    return true;
}

所以我需要知道在继续之前我是否有错误...

感谢您的帮助!!!

2 个答案:

答案 0 :(得分:1)

<强> ES6

onSubmit: function(doc){ // Gestion du formulaire d'inscription
    // preventDefault() ????
    var formData = {
        title: doc.title,
        content: doc.content
    };

    //get the captcha data
    var captchaData = grecaptcha.getResponse();

    Meteor.call('createCPDM', formData, captchaData, err => {
        if(err) {
             // Appelle onError
            return this.done(new Error("Une erreur s'est produite"));
        }

        this.done(); // Appelle onSuccess
        grecaptcha.reset();
    });
}

<强> ES5

onSubmit: function(doc){ // Gestion du formulaire d'inscription
    // preventDefault() ????
    var formData = {
        title: doc.title,
        content: doc.content
    };

    //get the captcha data
    var captchaData = grecaptcha.getResponse();
    var self = this

    Meteor.call('createCPDM', formData, captchaData, function(err) {
        if(err) {
             // Appelle onError
            return self.done(new Error("Une erreur s'est produite"));
        }

        self.done(); // Appelle onSuccess
        grecaptcha.reset();
    });
}

答案 1 :(得分:0)

Meteor.call永远不会同步返回服务器端返回值。

如果要在Meteor中使用服务器端计算的结果,唯一的方法是在回调函数中。引用documentation

  

如果你包含一个回调函数作为最后一个参数[...]   该方法将异步运行:它将不返回任何内容   特别是不会抛出异常。当方法是   完成[...]将使用两个参数调用回调:error   和结果。

您可以显示面向用户的通知(如旋转轮),直到回调获得服务器端结果。