- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 50k 条目的列表,我正在输入我的数据库。
var tickets = [new Ticket(), new Ticket(), ...]; // 50k of them
tickets.forEach(function (t, ind){
console.log(ind+1 + '/' + tickets.length);
Ticket.findOneAndUpdate({id: t.id}, t, {upsert: true}, function (err, doc){
if (err){
console.log(err);
} else {
console.log('inserted');
}
});
});
而不是预期的交错
1 / 50000
inserted
2 / 50000
inserted
我正在获取所有索引,然后是所有插入的确认
1 / 50000
2 / 50000
...
50000 / 50000
inserted
inserted
...
inserted
我认为 process.nextTick 发生了一些事情。几千条记录后速度明显下降。
有谁知道如何获得高效的交错?
最佳答案
Instead of the expected interleaving
这只是同步 I/O 的预期行为。
请记住,这些操作都是异步的,这是 node.js 的关键思想。代码的作用是这样的:
for each item in the list,
'start a function' // <-- this will immediately look at the next item
output a number (happens immediately)
do some long-running operation over the network with connection pooling
and batching. When done,
call a callback that says 'inserted'
现在,代码将启动大量这些函数,这些函数依次向数据库发送请求。所有这一切都将在第一个请求甚至到达数据库之前很久就发生。很可能操作系统甚至懒得在你到达之前实际发送第一个 TCP 数据包,比如票 5 或 10 左右。
根据您的评论回答问题:不,请求将相对较快地发送出去(这取决于操作系统),但结果不会到达您的单线程 javascript 代码在您的循环尚未完成 50k 条目的排队之前。这是因为 forEach
是您当前正在运行的一段代码,并且在它运行时进入的所有事件只会在它完成后才被处理 - 如果您使用 setTimeout,您会观察到同样的情况(function() { console.log("inserted... not") }, 0)
而不是实际的数据库调用,因为 setTimeout
也是一个异步事件。
要使您的代码完全异步,您的数据源应该是某种提供数据的(异步)迭代器,而不是大量的项目。
关于javascript - mongoDB 插入和处理.nextTick,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28844354/
当在代码中更新了数据,并希望等到对应的Dom更新之后,再执行一些逻辑。这时,我们就会用到$nextTick ?
我是 Vue js 新手,我试图理解方法中使用 nextTick 的逻辑。所以我有两个这样的组件: IsTuruIslem.vue ... ... .
如果我有这样的代码: class SomeClass constructor: -> @someAttr = false someFunction: -> process.ne
我正在尝试测试我的应用程序在连续两次 tick 上发生的情况。这是我目前所拥有的(测试在 karma devtools 中失败,但在命令行中失败): import { mount } from 'av
我偶然发现了一个函数( here on SO ),它可以写入文件,但确保不会覆盖文件: function writeFile(i){ var i = i || 0; var fileN
我有一个 我有一个已安装的方法,可以在其中初始化 map 。 mounted(){ this.map = L.map(this.mapId, { preferCanvas: true }).setV
尝试递归调用同步函数来解析数组的元素;一旦到达数组的最后一个元素,就会调用回调。但是,当传递给 process.nextTick 时,回调被认为是未定义的,因为在与回调相同的范围内声明的另一个变量会打
我有一个 50k 条目的列表,我正在输入我的数据库。 var tickets = [new Ticket(), new Ticket(), ...]; // 50k of them tickets.f
下面的程序会在 NodeJS 中挂起,有人知道为什么吗? ended = false;events = require('events');eventEmitter = new events.Even
Node.js 版本 0.10 今天发布,并引入了 setImmediate。 API changes文档建议在执行递归 nextTick 调用时使用它。 来自什么MDN says它看起来与proce
我应该多久或何时使用 process.nextTick ? 我明白它的目的(主要是因为 this 和 this )。 根据经验,当我必须调用回调时,我总是使用它。这是一般方法还是还有其他方法? 此外,
更新:事实证明这是一个非常愚蠢的问题。我只是没有注意到引用的示例中的一些简单的事情。 我一直在查看有关滴答声和事件循环的信息,大部分内容都很清楚,但 the nextTick documentatio
下面是“practise01.js”文件中的代码, function fn(name){ return f; function f(){ var n = name;
Node.js 0.10 版今天发布,引入了setImmediate。 API changes文档建议在进行递归 nextTick 调用时使用它。 来自MDN says它似乎与 process.nex
我读过 nextTick 允许在下一个操作中执行代码。但这在我的代码中不起作用,有人可以帮助我吗?请纠正我。谢谢。 .vue ..... methods:{ getUserInfo(){
使用 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/EventLoop 中的视觉表示: setImmediate() 和
我从人们那里得到的印象是...除非与 process.nextTick 一起使用,否则所有 JavaScript 函数都是同步的。什么时候使用它最好? 我想确保我不会在不需要它的地方过度使用它。在这一
无论好坏,我们 stub process.nextTick 以同步调用它的第一个参数(回调)。看代码: global.test_clock = sinon.useFakeTimers(); sinon
我正在尝试测试此 site 中找到的 Yahoo API。但是,我可以获得“请求 token ”,但我似乎不知道如何继续,因为我的应用程序抛出 process.nextTick 错误 此外,如果可能的
我遇到了这个express.js路线,它是 small example in its official repo 的一部分,演示如何处理错误,看看: app.get('/next', function
我是一名优秀的程序员,十分优秀!