栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

流星和Fibers / bindEnvironment()怎么了?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

流星和Fibers / bindEnvironment()怎么了?

您使用的bindEnvironment略有错误。因为它的使用位置已经在光纤中,而离开Knox客户端的回调不再在光纤中。

bindEnvironment有两个用例(我可以想到,可能还有更多用例!):

  • 您有一个必须更改的全局变量,但您不希望它影响其他用户的会话

  • 您正在使用第三方api / npm模块管理回调(情况似乎如此)

Meteor.bindEnvironment
创建一个新的光纤,并将当前光纤的变量和环境复制到新的光纤。您需要的是使用nom模块的方法回调时。

幸运的是,还有另一种方法可以处理等待您的回调并将该回调绑定到名为的光纤中

Meteor.wrapAsync

因此,您可以这样做:

您的启动函数已经有一个光纤并且没有回调,因此您在这里不需要bindEnvironment。

Meteor.startup(function () {   if (Projects.find().count() === 0) {     insertRecords();   }});

而且您的插入记录功能(使用wrapAsync)使您不需要回调

function insertRecords() {  console.log("inserting...");  var client = Knox.createClient({    key: apikey,    secret: secret,    bucket: 'profile-testing'  });  client.listSync = Meteor.wrapAsync(client.list.bind(client));  console.log("created client");  try {      var data = client.listSync({ prefix: 'projects' });  }  catch(e) {      console.log(e);  }  if(!data) return;  for (var i = 1; i < data.Contents.length; i++)  {    console.log(data.Contents[i].Key);    if (data.Contents[i].Key.split('/').pop() == "") {      Projects.insert({ name: data.Contents[i].Key, contents: [] });    } else if (data.Contents[i].Key.split('.').pop() == "jpg") {      Projects.update( { name: data.Contents[i].Key.substr(0,   data.Contents[i].Key.lastIndexOf('.')) }, { $push: {contents: data.Contents[i].Key}} );    } else {      console.log(data.Contents[i].Key.split('.').pop());    }  }      });

有两件事要牢记。纤维不像螺纹。NodeJS中只有一个线程。

光纤更像是可以同时运行的事件,但如果存在等待类型的情况(例如,从Internet下载文件),则不会互相阻塞。

因此,您可以拥有同步代码,而不会阻止其他用户的事件。它们轮流运行,但仍在单个线程中运行。因此,这就是Meteor在服务器端具有同步代码的方式,可以等待内容,但是其他用户不会因此而受阻,并且可以执行内容,因为他们的代码在不同的光纤上运行。

克里斯·马瑟(Chris
Mather)在http://eventedmind.com上有几篇很好的文章

Meteor.wrapAsync是做什么的?

Meteor.wrapAsync
接受您提供的方法作为第一个参数,并在当前光纤中运行它。

它还会附加一个回调(假定该方法采用的最后一个参数具有回调,其中第一个参数是错误,第二个参数是

function(err,result)

回调与绑定

Meteor.bindEnvironment
并阻塞当前Fiber,直到触发回调为止。回调触发后立即返回
result
或引发
err

因此,将异步代码转换为同步代码非常方便,因为您可以在下一行使用方法的结果,而不必使用回调和嵌套更深层的函数。它还可以为您处理bindEnvironment,因此您不必担心丢失光纤的作用域。

*

Meteor._wrapAsync
现在已
*更新
Meteor.wrapAsync
并记录在案。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/394654.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号