在Meteor中,Meteor.wrapAsync阻止其他呼叫吗?

时间:2015-07-01 11:07:13

标签: node.js asynchronous meteor

在Meteor JS代码中,我使用HTTP.get方法在方法内调用服务器。我必须将结果返回给客户端,所以我用这个函数包装 Meteor.wrapAsync获得同步功能。

var httpSync = Meteor.wrapAsync(HTTP.get, this);
var result = httpSync(myUrl);

我的问题是 - Meteor.wrapAsync(AsyncFunction)会阻止其他请求吗?它会影响多个请求的并行执行吗?

1 个答案:

答案 0 :(得分:4)

它不会阻止整个服务器。 Meteor使用fibers包提供"同步查找"不会阻止整个服务器的功能。

但是,它会阻止来自同一用户的其他方法。如果您希望该用户的其他方法同时运行,请在方法中调用public class MyToolStripButton : ToolStripButton { public IList<Image> Images { get; private set; } public MyToolStripButton(String text, IList<Image> images) : base(text) { Images = images.OrderBy(i => i.Height).ToList(); ImageScaling = ToolStripItemImageScaling.None; RefreshImage(); } protected override void OnFontChanged(EventArgs e) { base.OnFontChanged(e); RefreshImage(); } public void RefreshImage() { int h = this.Height; Image bestImage = null; for (int i = 0; i < Images.Count; i++) { var img = Images[i]; if (img.Height > h || i == Images.Count - 1) { bestImage = img; break; } } // scale down the image Image oldImage = this.Image; Bitmap newImage = new Bitmap(h, h); using (var g = Graphics.FromImage(newImage)) { g.DrawImage(bestImage, 0, 0, h, h); } this.Image = newImage; if (oldImage != null) oldImage.Dispose(); } } [STAThread] static void Main() { Form f = new Form(); MenuStrip menu1 = new MenuStrip() { Dock = DockStyle.Top }; f.Controls.Add(menu1); f.MainMenuStrip = menu1; int[] res = { 16, 32, 48, 64, 128 }; Image[] images = new Image[res.Length]; for (int i = 0; i < res.Length; i++) { Bitmap img = new Bitmap(res[i], res[i]); using (var g = Graphics.FromImage(img)) { g.DrawEllipse(Pens.Red, 0, 0, res[i], res[i]); } images[i] = img; } MyToolStripButton btn1 = new MyToolStripButton("Button", images); btn1.Click += delegate { Font fnt = btn1.Owner.Font; btn1.Owner.Font = new Font(fnt.FontFamily, fnt.Size + 2f, fnt.Style); }; menu1.Items.Add(btn1); Application.Run(f); }

  

在服务器上,来自给定客户端的方法一次运行一个。来自客户端的第N + 1次调用不会开始,直到第N次调用返回。但是,您可以通过调用this.unblock()来更改此设置。这将允许第N + 1次调用开始在新光纤中运行。

顺便说一句,您不需要this.unblock Meteor.wrapAsync,因为它已经可以同步使用了。 HTTP.get旨在与非Meteor设计的外部库一起使用。