问题标签 [node-fibers]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
1432 浏览

javascript - Meteor (Fibers) 循环和回调

流星纤维“同步”模式让我发疯。这是一个简单的代码示例:

我不明白如何使这项工作。循环结束后调用回调,但应保留内部内部变量(例如 feed)……而它们不是。

解析的 url 很好(第一个,然后是第二个),但是我无法更新我的数据,因为我在回调中没有好的 _id。

想要的输出将是:“1234”“0”和“6789”“1”,而不是“6789”“2”两次......你如何在 Meteor / Fiber 代码中做到这一点?

0 投票
0 回答
466 浏览

node.js - Node.js 中的生成器——Fiber 还是纯 JavaScript?

我正在尝试在 Node.js 中实现生成器。我遇到了node-fibernode-lazy。Node-lazy 处理数组和流,但本质上不会生成惰性事物(数字除外)。

虽然使用 Fiber 看起来更干净,但它也有其缺点,因此,我更喜欢带有闭包的纯 Javascript,因为它更明确。我的问题是:使用闭包生成迭代器是否存在内存或性能问题

例如,只要调用者要求,我就尝试以深度优先方式遍历树。我想首先找到'waldo'并停止。

纤维:

带有闭包的纯 JavaScript:

0 投票
2 回答
766 浏览

meteor - 在 Modulus.io 上为 Meteor 应用程序重新安装节点光纤?

我正在尝试将 Meteor 应用程序从 Heroku 移植到 Modulus.io(希望能够测试粘性会话和水平缩放)。我已经使用 Modulus.io 脚本对我的应用程序进行了分解,如以下文章和存储库中所述。

https://github.com/onmodulus/demeteorizer
http://blog.modulus.io/demeteorizer

解压缩后,我压缩并上传,并在浏览器中得到一个空的部署日志和一个白屏。经过一番研究,我删除了生成的 demeteorized 应用程序中的 node_modules 目录,然后压缩并上传。这似乎绝对是正确的举动,因为一切都开始部署,并且日志变得忙碌。

这是我想出的错误:

有人知道我应该如何使用 demeteorized Meteor 应用程序在 Modulus.io 环境中“重新安装节点光纤”吗?我在这里离开了我的联盟,不知道如何继续。

提前感谢您的任何想法或建议!

0 投票
4 回答
3191 浏览

meteor - 如何从 Meteor 自己的回调中调用异步方法?

我刚刚花了几个小时阅读 SO 的答案,例如Meteor: Calling an asynchronous function inside a Meteor.method and return the result

不幸的是,我仍然没有设法使用光纤或期货。

我正在尝试做一些相当简单的事情(我认为!)。

创建用户时,根据异步方法的结果向用户对象添加一个变量。所以想象一下,如果你会在名为 BANK 的第 3 方数据库服务器上调用我的异步方法,这可能需要几秒钟才能返回。

});

所以上面发生的事情是调用了 BANK 方法,但是当它返回时,代码已经继续前进,并且永远不会调用 _.extend。

我尝试将返回调用放在 Fiber 中,这只会让事情变得更糟:它永远不会返回用户。确实如此,但为时已晚 3 秒,所以到那时下游的一切都在救助。

感谢您的任何帮助!

0 投票
1 回答
1153 浏览

node.js - 使用 setTimeout 调度的 Node.js Fiber 和代码会导致崩溃

我正在使用Fibers来解决有关如何让 node.js 中的事件循环控制的问题,暂停一些同步代码的执行。大多数情况下,这很好用,但是我遇到了一个奇怪的崩溃,但是我找不到它的原因。

设置

有三个过程:

  • 一个主服务器进程,它接收要检测和执行的代码。当它接收到执行它的新代码时,使用 child_process.fork() 生成
  • 一个执行过程。这会检测接收到的代码以不时调用特定的回调来报告执行代码中发生的情况。然后它在使用Contextify创建的沙箱中执行代码。有时,这些报告包含有关代码中发生的行和列的不正确位置信息。在这种情况下,需要一个源映射来将检测代码中的位置映射到原始代码中的位置。但是计算这个源映射需要大量的时间。因此,在开始执行之前,执行过程会产生
  • 源映射计算过程。这只是获取原始代码和检测代码并计算源映射。完成后,它将完成的源映射发送到执行进程并退出。

如果执行过程在执行完成之前需要回调中的源映射,它将使用 Fiber.yield() 将控制权交给事件循环,从而暂停执行。当执行进程接收到数据后,它会使用 pausedFiber.run() 继续执行。

这是这样实现的:

总结一下:当收到新代码时,会创建一个新进程来执行它。这个过程首先检测然后执行它。在这样做之前,它会启动第三个过程来计算代码的源映射。检测代码调用名为的函数callback在上面的代码中,将消息传递给运行时报告执行代码的进度。有时必须调整这些,需要调整的一个示例是“控制台日志”消息。要进行这种调整,需要通过第三个过程计算的源图。当回调需要源映射时,它调用 getSourceMap() 等待 sourceMap 进程完成其计算并在该等待时间内将控制权交给事件循环以使其能够从 sourceMap 进程接收消息(否则事件循环将是被阻止并且无法接收到任何消息)。

传递给回调的消息首先存储在一个数组中,然后出于性能原因作为批处理发送到主进程。但是,我们不希望主进程等待消息的时间过长,因此除了在达到阈值时发送一批消息外,我们还安排了一个函数sendMessagesWithEventLoopTurnAround()在事件循环中运行并检查是否有消息要发送。这有两个优点:

  1. 当执行进程正在等待源映射进程时,它可以利用这段时间发送它已经得到的消息。因此,如果 sourceMap 进程需要几秒钟才能完成,则主进程不必为已创建并包含正确数据的消息等待相同的时间。
  2. 当执行代码在事件循环中只生成非常少的消息时(例如,通过调度的函数setTimeInterval(f, 2000)每次执行只创建一条消息),它不必等待很长时间直到消息缓冲区已满(在本例中为 200 秒)但每 10 毫秒接收一次有关进度的更新(如果有任何变化)。

问题

什么有效

此设置在以下情况下工作正常

  1. 我不使用纤维和单独的过程来计算源图。相反,我在执行代码之前计算源映射。在这种情况下,我尝试执行的所有代码都按预期工作。
  2. 我确实使用了光纤和一个单独的进程并执行我不需要源映射的代码。例如 var a = 2;

    setTimeout(function () { var a = 2;}, 10)

在第一种情况下,输出如下所示。

  1. 我确实使用了纤维和一个单独的进程和代码,我需要源映射但不使用事件循环,例如 console.log("foo");

在这种情况下,输出如下所示:

  1. 我确实使用了 Fiber 和一个单独的进程和代码,我需要源映射并使用事件循环,但只有在源映射计算已经完成时才需要源映射(因此无需等待)。

例如

在这种情况下,输出如下所示:

什么不起作用

只有当我使用纤维和使用事件循环但在完成之前需要源映射的单独进程和代码时它才会中断,例如

然后输出如下所示:

这里崩溃的进程是执行进程。但是,我不知道为什么会发生这种情况或如何追查问题。正如你在上面看到的,我已经添加了几个日志语句来找出发生了什么。我也在听执行过程中的“未捕获的异常”事件,但这似乎没有被触发。

另外,我们最后看到的日志消息不是我的,因为我在日志消息前面加上了某种描述字符串,所以它是由 node.js 自己创建的。我既不明白为什么会发生这种情况,也不明白退出代码 8 是什么,甚至我还能做些什么来缩小原因。任何帮助将不胜感激。

0 投票
1 回答
262 浏览

javascript - Meteor 的节点光纤故障

我正在尝试为 Meteor 编写一个简单的身份验证后端,该后端针对 LDAP 服务器进行身份验证。我需要注册为登录处理程序的函数(的输入Accounts.registerLoginHandler)来返回id刚刚登录的用户。

我认为问题在于我创建的 Fiber getUserId,并且它没有id像我想要的那样返回。我知道它必须在光纤中,否则流星会​​生气并引发错误。即使之前的日志yield显示我id不是未定义的,也getUserId.run()总是返回未定义的。

任何帮助将不胜感激,谢谢!

0 投票
1 回答
445 浏览

mongodb - 在流星服务器中部署时,流星代码必须始终在光纤中运行

当我将我的应用程序部署到流星云服务器上时,我一直遇到这个错误。

Meteor 代码必须始终在 _.extend.get (app/packages/meteor/dynamics_nodejs.js:14:13) 的 _.extend.apply (app/packages/livedata/livedata_server.js:1268:57) 的 Fiber 中运行在 _.extend.call (app/packages/livedata/livedata_server.js:1229:17) 在 Meteor.startup.Meteor.methods.streamTwit (app/server/server.js:50:24)

但是,我已经包裹在 Fibers 中

我不知道是什么原因,但有人建议我应该用 Meteor.bindEnvironment 包装它。因此,我这样做了:

//添加问题方法

但现在它甚至不起作用。我意识到这仅在我尝试将一些数据插入 mongodb 时发生。我可以知道我的代码有什么问题吗?谢谢!所有这些代码都写在 app/server/server.js

0 投票
4 回答
4698 浏览

meteor - 与光纤模块相关的 Meteor 部署问题

在尝试部署流星时,我通过以下方式安装节点光纤:

然后安装光纤

它似乎已安装但带有此消息:

但是,在使用以下方式部署代码时:

我收到此错误:

我可以看到 linux-x64-v8-3.xx 的版本不同。我正在使用 Ubuntu 13.04

Node版本是v0.11.3 NPM版本是1.2.18

0 投票
1 回答
1066 浏览

javascript - 如何在服务器方法之外使用 setPassword

我需要在流星服务器方法之外使用 Accounts.setPassword,但在服务器端。在这种情况下,对于集合,我使用 Fiber 包装器,但它不适用于 Accounts.setPassword。

0 投票
1 回答
530 浏览

node.js - 每次之后的meteor.js纤维回调

我试图在_.each 完成后调用一些函数......我试图用纤维来做。但是,如果您向我展示如何使用 underscore.js AFTER 方法来做到这一点,我也会很高兴。

现在我有这个:

而且我还需要放置在某个地方 fiber.run() 或者?但我不知道在哪里。

当每个循环完成时,我想再次调用一些函数让我们说finished()。