【问题标题】:Synchronisation issue with error on MeteorMeteor 上出现错误的同步问题
【发布时间】:2016-04-13 17:01:21
【问题描述】:

嘿,我在管理 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;
}

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

感谢您的帮助!!!

【问题讨论】:

  • Javascript 主要是一种 异步 语言,所以将 Meteor.call 之后的所有内容放在回调中
  • @Endless 实际上我不能这样做,因为我需要访问this.done()
  • 只需将function(err){} 更改为err => {} 即可访问this.done
  • 或做类似var self = this & self.done()

标签: javascript asynchronous meteor


【解决方案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();
    });
}

【讨论】:

  • 第一个解决方案 ES6 对我不起作用,但第二个解决方案可以!谢谢
【解决方案2】:

Meteor.call 从不同步返回服务器端返回值。

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

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

在回调获得服务器端结果之前,您可能会显示面向用户的通知(如旋转的轮子)。

【讨论】:

  • 感谢您的回答!我理解这个想法,我也有同样的想法,但我不知道如何“阻止”客户端等待服务器端结果......
  • 你不会在 JavaScipt 中阻塞。如果您需要“this”变量,请使用保留“this”值的箭头函数语法。像这样:Meteor.call("some", () => { this.boo(); });
猜你喜欢
  • 2021-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-18
  • 2016-01-13
  • 2019-10-19
  • 2015-10-18
相关资源
最近更新 更多