可以在另一个Meteor.call中调用一个Method吗?

时间:2017-01-06 15:34:46

标签: meteor

我在同一个事件click .open-message上有两种方法:

  • sendEmailContact:此方法发送邮件
  • openMessage:此方法更新邮件(从new stateresponded state

这两种方法工作正常,但是分开。

我的想法是通过Meteor.call('sendEmailContact'并仅成功通过Meteor.call('openMessage'

在我目前的活动之下&我的失败尝试

当前事件

Template.Users.events({
    'click .open-message':function() {
        Meteor.call('openMessage', this._id, function(error) {
            if(error) {
                Bert.alert({
                    title: 'Error',
                    message: error.reason,
                    type: 'danger'
                });
            } else {console.log ("ok");}
        });
        var to = this.email; // catch the to value
        var contactmessage = this.message; // catch the original message
        swal({
          input: 'textarea',
          title: "Response to " + to,
          text: "H " + contactmessage,
          type: "",
          showCloseButton: true,
          showCancelButton: true,
          confirmButtonColor: "#272b35",
          confirmButtonText: "Send"
        }).then(function (text){
            if(message != '') {
            var from = "my@mail.com"
            var subject = "Response to your message";
            var message = text; //catch the value of the textarea
            Meteor.call('sendEmailContact', to, from, subject, message, contactmessage, (error) => {
                if(error) {
                    Bert.alert({
                        title: 'Error',
                        message: error.reason,
                        type: 'danger'
                    });
                    console.log (to);
                    console.log (from);
                    console.log (subject);
                    console.log (message);
                } else {
                    console.log (to);
                    console.log (from);
                    console.log (subject);
                    console.log (message);
                    //target.text.value = ''; // Clear form
                    Bert.alert({
                        title: 'Success',
                        message: 'Message sended.',
                        type: 'success'
                    });
                }
            });
            } else {
                Bert.alert({
                    title: 'Error',
                    message: 'Message error.',
                    type: 'danger'
                });
                console.log (to);
                console.log (from);
                console.log (subject);
                console.log (message);
            }
        }, function (dismiss) {
            if (dismiss === 'cancel') {
                null
                //handle dismiss events like 'cancel', 'overlay', 'close', and 'timer'
            }
        })
    }
});

不成功尝试(没有错误,第一种方法没问题,但第二种方法没有任何内容(console.log ("ok");有效))

Template.Users.events({
    'click .open-message':function() {
        var to = this.email; // catch the to value
        var contactmessage = this.message; // catch the original message
        swal({
          input: 'textarea',
          title: "Response to " + to,
          text: "H " + contactmessage,
          type: "",
          showCloseButton: true,
          showCancelButton: true,
          confirmButtonColor: "#272b35",
          confirmButtonText: "Send"
        }).then(function (text){
            if(message != '') {
            var from = "my@mail.com"
            var subject = "Response to your message";
            var message = text; //catch the value of the textarea
            Meteor.call('sendEmailContact', to, from, subject, message, contactmessage, (error) => {
                if(error) {
                    Bert.alert({
                        title: 'Error',
                        message: error.reason,
                        type: 'danger'
                    });
                    console.log (to);
                    console.log (from);
                    console.log (subject);
                    console.log (message);
                } else {
                    Meteor.call('openMessage', this._id, function(error) {
                        if(error) {
                            Bert.alert({
                                title: 'Error',
                                message: error.reason,
                                type: 'danger'
                            });
                        } else {console.log ("ok");}
                    });
                    console.log (to);
                    console.log (from);
                    console.log (subject);
                    console.log (message);
                    //target.text.value = ''; // Clear form
                    Bert.alert({
                        title: 'Success',
                        message: 'Message sended.',
                        type: 'success'
                    });
                }
            });
            } else {
                Bert.alert({
                    title: 'Error',
                    message: 'Message error.',
                    type: 'danger'
                });
                console.log (to);
                console.log (from);
                console.log (subject);
                console.log (message);
            }
        }, function (dismiss) {
            if (dismiss === 'cancel') {
                null
                //handle dismiss events like 'cancel', 'overlay', 'close', and 'timer'
            }
        })
    }
});

修改

以下两种方法:

//Contact Method
Meteor.methods({
    insertMessage: function(message) {
        ContactMessages.insert(message);
    },
    openMessage: function(messageId) {
        ContactMessages.update({_id: messageId}, {$set: {new: false, responded: true}});
    },
    deleteMessage: function(messageId) {
        ContactMessages.remove({_id: messageId});
    }
});

//Send ContactReply Method
Meteor.methods({
    sendEmailContact: function(to, from, subject, message, contactmessage) {
        check([to, from, subject, message, contactmessage], [String]);

        // Let other method calls from the same client start running,
        // without waiting for the email sending to complete.
        this.unblock();

        Email.send({
          to: to,
          from: from,
          subject: subject,
          text: message + contactmessage
        });
    }
});

2 个答案:

答案 0 :(得分:1)

您需要将messageId作为额外参数从客户端传递给sendEmailContact,但这应该非常简单:

Meteor.methods({
    insertMessage(message) {
        ContactMessages.insert(message);
    },
    openMessage(messageId) {
        ContactMessages.update(messageId, {$set: {new: false, responded: true}});
    },
    deleteMessage(messageId) {
        ContactMessages.remove(messageId);
    }
});

//Send ContactReply Method
Meteor.methods({
    sendEmailContact(messageId,to, from, subject, message, contactmessage) {
        check([messageId, to, from, subject, message, contactmessage], [String]);
        this.unblock();
        Email.send({
          to: to,
          from: from,
          subject: subject,
          text: message + contactmessage
        });
        Meteor.call('openMessage',messageId);
    }
});

除非您想在那里记录潜在错误,否则您甚至不需要嵌入式Meteor.call()的回调。

答案 1 :(得分:0)

在你的第二个例子中:

Meteor.call('openMessage', this._id, function(error) {

我认为它不知道“这个”是什么。

将其保存在函数顶部并通过闭包使用保存的值。

我也想知道为什么客户端是调用这两种方法的客户端很重要。技术上可以处理服务器上的所有内容;这是你的应用程序中有意义的东西吗?