Javascript 非阻塞代码执行

Javascript 非阻塞代码执行,javascript,jquery,asynchronous,meteor,Javascript,Jquery,Asynchronous,Meteor,我有一个Meteor项目定义了一些方法。在这些系统中,发送电子邮件。由于这需要花费大量的时间,并且会减慢最终用户的速度,所以我希望异步发送电子邮件。电子邮件是否成功发送对方法调用的结果没有影响 从我发现的情况来看,使用setTimeout模拟异步调用是很常见的。在这种情况下我也应该这么做吗 编辑:注释中要求的代码 export const UpdateMaterial = new ValidatedMethod({ name: 'material.update', validat

我有一个Meteor项目定义了一些方法。在这些系统中,发送电子邮件。由于这需要花费大量的时间,并且会减慢最终用户的速度,所以我希望异步发送电子邮件。电子邮件是否成功发送对方法调用的结果没有影响

从我发现的情况来看,使用
setTimeout
模拟异步调用是很常见的。在这种情况下我也应该这么做吗

编辑:注释中要求的代码

export const UpdateMaterial = new ValidatedMethod({
    name: 'material.update',
    validate: new SimpleSchema({
        id: {type: String},
        description: {type: String},
    }).validator(),
    run({id, description}){
        const _id = new Meteor.Collection.ObjectID(id);

        let res;
        if(Meteor.isServer) {
            res = Materials.update({_id}, {
                $set: {
                    'metadata.description': description
                }
            });
         }
        SendHTMLEmailToRoles(Titles.NewMaterial,Texts.NewMaterial, [Roles.Admin]);
        return res;
    }
});

export const SendHTMLEmailToRoles = (subject,html,roles) => {
    if(Meteor.isServer) {
        const users = Meteor.users.find({role: {$in: roles}}).fetch();
        const addresses =  users.map(function(user){
            if(!user.emails)
                return;
            return user.emails.pop().address;
        });
        Email.send({
            to: addresses,
            from: 'test@test.com',
            subject,
            html
        });
    }
}

如果我的理解是正确的,那么你展示的整个代码就是Meteor方法

在这种情况下,调用它根本不会阻塞客户机,因为所有Meteor调用都是异步的。这就是为什么您可以提供回调

然而,服务器上的Meteor方法是同步的,如果没有仔细设计的话。因此,如果客户再打电话,在电子邮件实际发送之前,他们不会被处理

要恢复服务器上发送电子邮件的某些异步行为,请注意Sergio()提供的参考页示例中的
this.unblock()


现在,如果您希望Meteor call客户端回调立即执行,而不必等待
Email.send()
完成,则必须延迟该指令(通常使用
setTimeout
包装该指令)让你的Meteor方法返回。

你的代码是什么?@epascarello编辑了question@SergioTulentsev我知道如何发送电子邮件,异步部分是问题所在,那里的文档说“异步发送电子邮件”。是的,其他方法可以访问(通过调用this.unblock())这不关我的事,我所需要的只是立即执行回调。我传递给函数的延迟是否重要?延迟(毫秒)取决于您希望服务器在实际调用
Email.send()指令之前做什么。大部分时间
0
已经足够了,因为您只想将指令推送到进程队列的末尾,这样其他挂起的任务(包括Meteor方法的其余部分)就可以在此之前执行。哦,谢谢,我不知道有一个选项可以在最后推送执行。实际上,这就是JS管理调用的方式:它们只是被推送到队列上
setTimeout
只需在给定延迟后推送一个新任务,但该任务实际上只会在处理队列上以前的任务后执行。这是否意味着延迟相当“最小保证延迟”如果长任务在调用timeout之后开始执行,并且在超时将超时任务推送到队列之前,超时任务将在运行任务完成之后执行?