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