首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么每次调用Readable._read()时Readable.push()都返回false

每次调用Readable._read()时,Readable.push()返回false的原因是因为Readable流还没有可读取的数据。

在Node.js中,Readable流是一种可读取数据的抽象接口。当我们使用Readable流时,需要实现_read()方法来提供数据。在每次调用_read()方法时,我们可以使用Readable.push()方法将数据推送到流中。

Readable.push()方法返回false时,表示当前流中没有更多的数据可供读取。这可能是因为数据已经被完全读取,或者数据还没有准备好。在这种情况下,我们可以通过监听'readable'事件来等待更多的数据可供读取。

需要注意的是,Readable.push()方法返回false并不意味着流已经结束。只有当我们调用Readable.push(null)时,才表示流的结束。

对于这个问题,如果你遇到了Readable.push()返回false的情况,可以检查以下几个可能的原因:

  1. 数据还没有准备好:可能是因为数据的生成或获取过程比较耗时,需要等待一段时间才能继续推送数据。可以通过监听'readable'事件来等待更多的数据可供读取。
  2. 数据已经被完全读取:可能是因为之前已经读取了所有的数据,没有更多的数据可供读取。可以通过监听'end'事件来判断流是否已经结束。
  3. 数据推送过快:可能是因为数据推送的速度过快,超过了消费者读取数据的速度。在这种情况下,可以使用Readable.push()方法的返回值来控制数据的推送速度,确保不会一次性推送过多的数据。

总之,每次调用Readable._read()时,Readable.push()返回false表示当前流中没有更多的数据可供读取,需要等待更多的数据或者判断流是否已经结束。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Node.js Stream - 进阶篇

由于流动模式下,每次都是从缓存中取第一个元素,所以这时read()返回值一定不为null。 故flow()中的循环还在继续。...writable内部维护了一个写队列,当这个队列长度达到某个阈值(state.highWaterMark),执行write()返回false,否则返回true。...当write()返回false调用readable.pause()使上游进入暂停模式,不再触发data事件。...这是因为第一个数据(A)迟迟未能写完(未调用next()),所以后面通过write方法添加进来的数据便被缓存起来。 下游的缓存队列到达2,write返回false,上游切换至暂停模式。...当可写端的缓存队列也到达阈值,transform.write()返回false,上游进入暂停模式,不再继续transform.write()。

1.6K62
  • Node.js 流编程

    缓冲模式和流模式缓冲模式(buffer mode),在这种模式下系统会把某份资源传来的所有数据,先收集到一个缓冲区里,直到操作完成为止。然后,系统把这些数据当成一个模块回传给调用方。...一旦流准备好接受更多数据,则 \_read() 将在每次调用 this.push(dataChunk) 后再次调用。...\_read() 可能会继续从资源中读取并推送数据,直到 readable.push() 返回 false。...即便 write() 返回 false,我们也还是可以忽略这个信号,继续往里面写入,让缓冲区越变越大。...这套机制其实在 Readable 流中也有类似的体现,在实现 \_read() 方法,如果发现自己调用 push() 方法得到的结果是 false,那就不应该再向其中推送新数据了。

    17710

    一文读懂NodeJs知识体系和原理浅析

    对于 JS 内存泄漏,我们也可以使用同样的道理,借助工具,打印每次的内存快照,对比得出代码中的问题。...Internal JavaScript Evaluation Failure JavaScript 的源码启动 Node 进程,评估返回函数失败。非常罕见,仅会在开发 Node 才会有。...// 这个方法比调用 Buffer.alloc() 更快, // 但返回的 Buffer 实例可能包含旧数据, // 因此需要使用 fill() 或 write() 重写。...当全部数据生产出来后,必须调用push(null)来结束可读流。 流一旦结束,便不能再调用push(data)添加数据。 可以通过监听data事件的方式消耗可读流。...('a') readable.push('b') readable.push({}) readable.push(null) readable.on('data', data => console.log

    1.3K10

    一文读懂NodeJs知识体系和原理浅析_2023-03-01

    对于 JS 内存泄漏,我们也可以使用同样的道理,借助工具,打印每次的内存快照,对比得出代码中的问题。...Internal JavaScript Evaluation Failure JavaScript 的源码启动 Node 进程,评估返回函数失败。非常罕见,仅会在开发 Node 才会有。...// 这个方法比调用 Buffer.alloc() 更快, // 但返回的 Buffer 实例可能包含旧数据, // 因此需要使用 fill() 或 write() 重写。...当全部数据生产出来后,必须调用push(null)来结束可读流。 流一旦结束,便不能再调用push(data)添加数据。 可以通过监听data事件的方式消耗可读流。...('a') readable.push('b') readable.push({}) readable.push(null) readable.on('data', data => console.log

    1.2K00

    一篇文章弄明白Node.js与二进制数据流

    可以看到上图,Node.js 8 之前,为了高性能的考虑,Buffer 开辟的内存空间并未释放之前已存在的数据,直接将这个 Buffer 返回可能导致敏感信息的泄露。...这里提到的 Unicode 编码又被称为统一码、万国码、单一码,它为每种语言设定了统一且唯一的二进制编码,而上面说的 UTF-8、UTF-16 都是他的一种实现方式。...由于 Buffer 在调用 toString 方法,默认使用的是 utf8 编码,所以输出了乱码,这里我们将 toString 的编码方式改成 utf16 就可以正常输出了。...可读流在创建,默认为暂停模式,一旦调用了 .pipe,或者监听了 data 事件,就会自动切换到流动模式。...写入如果结束,一般需要调用可写流的 .end() 方法,表示结束本次写入,此时还会调用 finish 事件。

    3.4K30

    【React源码笔记】setState原理解析

    点击上方蓝字,发现更多精彩 导语 大家知道React是以数据为核心的,当状态发生改变组件会进行更新并渲染。...为什么setState是有时候是异步会不会有同步的呢?为什么多次更新state的值会被合并只会触发一次render?为什么直接修改this.state无效???...true才会继续走下面的生命周期;如果返回false,生命周期被中断,虽然不调用之后的函数了,但是state仍然会被更新。...3. setState中的批量更新 如果每次更新state走一次四个生命周期函数,并且进行render,而render返回的结果会拿去做虚拟DOM的比较和更新,那性能可能会耗费比较大。...每次回调函数都能拿到更新后的state值,那就是每次partialState进行了更新。

    2.1K10

    function*生成器函数

    这种同步操作允许我们使用JavaScript的异步编程——function*每次返回一个特殊的指针,并不直接真正地返回值,因此function*内外的代码可以同时执行。...yield函数会暂停执行后面的代码,直到next()方法被调用,该方法的返回值包括表达式的结果和完成状态。...使用函数生成器函数不会执行,因此需要使用一次next()。 上文的程序为什么到最后变成undefined呢?...这是因为每次next()都会执行到yield关键字后的表达式处,并且将yield后的表达式结果作为value返回。...而add函数内只有两个yield,虽然三次调用next()才能完成调用过程,但最后一次不返回value,在函数末尾加上return语句就能让next返回return后的表达式值。

    2.3K30

    Android KeyEvent 点击事件分发处理流程(一)

    view_dispatchKeyEvent.png 如果 View 没有设置 OnKeyListener 或者 onKey() 返回 false ,View 会通过调用 KeyEvent...false ,将会通过分发事件的原路返回告知 Activity 当前事件还未被消耗,Activity 接收到 ViewGroup 返回false 消息就会去通过 KeyEvent 的 dispatch...DecorView_dispatchKeyEvent行为.png 那么,既然 Activity 返回 true 或 false 只对 DecorView 的行为有影响,那么为什么都能起到拦截事件分发的作用呢...这也是为什么返回 super.dispatchKeyEvent() 时事件会继续分发,因为这最终会调用到基类 Activity.java 的 dispatchKeyEvent() 方法来执行事件分发的逻辑...既然在 Activity 里返回 true 或 false 表示拦截,那么有什么区别么?

    3.7K60

    Flutter 通过源码一步一步剖析 Getx 依赖管理的实现

    return builderFunc(); } } } _InstanceBuilderFactory 里最关键的就是 getDependency 方法获取依赖,判断是否为单例,如果不为单例则每次调用...put 方法最后调用了 find 方法并把返回值 return 了回去,find 方法是获取依赖,最后调用了 find 方法,相当于插入依赖后马上又获取了依赖,这也是为什么 put 方法是直接传入依赖的实体对象...默认为 false, 通过前面的源码分析知道当 isSingleton 为 false 每次 find 都会重新创建依赖对象 ,所以 create 注入的依赖是不会随着页面销毁而移除依赖注入关系...,但却会每次调用 find 获取重新创建依赖对象。...不是强制删除直接 return false•判断依赖是否为 GetxServiceMixin 且不是强制删除直接 return false

    1.1K10

    一文说清楚配置数据源的参数

    鉴于在开发环境中,我们都使用过yml配置文件,而且我们在yml配置文件中,加入过连接数据库的配置,也就是配置我们的连接池,但是对于不同的数据库,连接数据库的 Jar 包也都是不一样的,而且对应的配置也是不一样的...(高效) testOnBorrow 程序申请连接,进行连接有效性检查(低效,影响性能) 一般的话,设置均为false testOnReturn 程序返还连接,进行连接有效性检查(低效,影响性能) 一般的话...这也是为什么有时候在排查日志的时候,会出现一些 close_wait 的错误,虽然知道并不影响业务,但是日志上看着还是难受。 那么为什么还要设置成 false 呢?...因为 testOnBorrow 能够确保我们每次都能获取到可用的连接,但如果设置成 true ,则每次获取连接的时候都要到数据库验证连接有效性,这在高并发的时候会造成性能下降,可以将testOnBorrow...这样在每次连接失效之后,都会通过validationQuery 来进行验证是否失效。

    63810

    日常开发中常遇到的一些问题和思考

    实际上,迭代器在每次调用next()方法的时候,第一步就会先去执行checkForComodification()方法,这个方法的目的就是检查list下的modCount是否 和expectedModCount...实际上modCount变量表示的含义是集合被修改的次数,每次对集合进行add或者remove的时候,则会对它进行+1,在调用集合的remove方法,该变量的值会被加1,但是expectedModCount...为什么会出现这样的结果呢,因为是Integer缓存了-128到127的数值,当使用"=="比较符,实际上比较的是两个对象的地址,因为Integer将-128到127的数值进行了缓存,所以在这个范围内的相同的两个值无论是使用...==还是equals比较结果都是true,因为它们是直接取的缓存中的值,但是不在这个范围内的话,则返回的是false。...当使用的是equals方法比较,不在这个范围内的相同的两个值返回的结果也是true,因为Integer内部重写了equals方法,该方法比较的是两个对象的中的值而不是地址。

    18310

    快速了解 React Hooks 原理

    现在,你应该有很多疑问,如: 当组件重新渲染每次都不会重新创建新的状态吗? React如何知道旧状态是什么? 为什么hook 名称必须以“use”开头? 这看起来很可疑。...然后再听说了调用顺序规则(它们每次必须以相同的顺序调用),这让我更加困惑。这就是它的工作原理。...它开始是空的, 每次调用一个hook,React 都会向该数组添加该 hook。...下次渲染,同样的3个hooks以相同的顺序被调用,所以React可以查看它的数组,并发现已经在位置0有一个useState hook ,所以React不会创建一个新状态,而是返回现有状态。...这就是React能够在多个函数调用中创建和维护状态的方式,即使变量本身每次超出作用域。

    1.4K10

    原创| Python中等于到底用 == 还是 is ?

    首先我们来看看这个例子,我们会发现x不管是使用 is 还是 == 返回True,但是x,z的内容一样,使用 == 返回的True,但是使用 is 时候返回却是False。...为什么x与y是相同的呢? 在Python中,= 不仅仅只是赋值,它还会将引用地址也赋过去,所以在内存中,x和y调用的是同一个对象。 大家可以参照下图 ?...每次当你创建一个新的字符串,都会去该字符串储蓄池查找,是否有相同的字符串值,如果存在则直接调用该字符串的引用地址。 相信你看到这,已经明白字符串为什么会一直相等了。 ?...也就是说,当你创建了一个整数在[-5,256]这个区间内,它会先去查看是否有相同的值,如果有则直接引用该地址。...总结:在Python中,只有小整数对象池中和字符串会调用已经存在的地址,其他的像list,tuple,dict都会重新创建一个新的对象。

    47120

    面试官最喜欢问的几个react相关问题

    在回调中你可以使用箭头函数,但问题是每次组件渲染都会创建一个新的回调。...: 默认每次调用setState,一定会最终走到 diff 阶段,但可以通过shouldComponentUpdate的生命钩子返回false来直接阻止后面的逻辑执行,通常是用于做条件渲染,优化渲染的性能...source参数,默认在每次 render 都会优先调用上次保存的回调中返回的函数,后再重新调用回调;useEffect(() => { // 组件挂载后执行事件绑定 console.log...;解决:函数导出静态方法赋值重新渲染: 由于增强函数每次调用返回一个新组件,因此如果在 Render中使用增强函数,就会导致每次重新渲染整个HOC,而且之前的状态会丢失;React的虚拟DOM和Diff...每次要更新 username,就要调用 setState更新状态;每次要获取 username的值,就要获取组件状态值。

    4K20

    如何设计一个幂等接口

    问:为什么要多次操作结果一致呢?比如我查询数据,每次查出来的一样,即使我修改了每次查出来的也都要一样吗? 答:我们说的多次,是指同一次请求中的多次操作。...响应超时而导致请求重试:在微服务相互调用的过程中,假如订单服务调用支付服务,支付服务支付成功了,但是订单服务接收支付服务返回的信息超时了,于是订单服务进行重试,又去请求支付服务,结果支付服务又扣了一遍用户的钱...大致有以下几种方案: 数据库记录状态机制:即每次操作前先查询状态,根据数据库记录的状态来判断是否要继续执行操作。比如订单服务调用支付服务,每次调用之前,先查询该笔订单的支付状态,从而避免重复操作。...校验token,如果用户没有携带token,直接返回false;如果携带了token,但是redis中没有这个token,说明已经被删除了,即已经访问了,返回false;如果redis中有,但是redis...中的token和用户携带的token不一致,也返回false;有且一致,说明是第一次访问,就将redis中的token删除,然后返回true。

    1.2K20

    基础面试,为什么面试官总喜欢问String?

    当我们想在字符串 s 后面拼接字符"ef",会在堆中创建一个新的对象,并将 s 的引用指向新创建的对象,由于 String 创建的是不可变对象,所以 String 类中的所有方法都不会改变它自身,而是返回一个新的字符串...或者 StringBuilder,否则,由于每次操作字符串都会创建一个新的对象,而旧的对象不会有引用指向它,这样我们会浪费很多垃圾回收的时间 到这里还没完,你有没有想过为什么 String 会被设置/...当创建一个字符串,如果该字符串已经存在于池中,那么返回现有字符串的引用,而不是创建一个新对象。...这意味着,不需要每次使用hashcode计算它。这样更有效率。...这也是为什么在一般情况下,不可变类是首选的原因。

    47110
    领券