我想知道是否有可能只从Fetch Response Body中的可读流中获取第一项,而不遍历它.

数据以原始字符串的形式出现,如下所示:

...
2023-11-28T00:00:00.0000000Z { "data": { ..., "p": "36966.01000000", ... } }
...

我不能简单地用JSON.parse()来解析它,所以我找到了一种方法来读取流,如下所示:

import split from 'split2'
import fetch from 'node-fetch'

const response = await fetch(<url>, <options>)
const lines = response.body.pipe(split())
for await (const line of lines) {
    let value = parseFloat(JSON.parse(line.split(' ')[1]).data.p)
    break
}

这种方法涉及在for...of个循环中穿过管道的线路,并在第一次迭代后将其断开.

有没有更高效、更优雅的方法呢?

推荐答案

您的代码对于处理可读的流和提取第一项来说已经相当合理了,而不需要迭代整个流. 您可能希望处理错误,并确保在处理所需数据后正确关闭流.

import split from 'split2';
import fetch from 'node-fetch';

try {
  const response = await fetch(<url>, <options>);

  if (!response.ok) {
    throw new Error(`HTTP error! Status: ${response.status}`);
  }

  const lines = response.body.pipe(split());
  for await (const line of lines) {
    try {
      const value = parseFloat(JSON.parse(line.split(' ')[1]).data.p);
      // Do something with the value
      console.log(value);
      break; // Stop after the first line
    } catch (error) {
      console.error('Error parsing line:', error.message);
    }
  }
} catch (error) {
  console.error('Fetch error:', error.message);
} finally {
  if (response && response.body) {
    response.body.destroy(); // Close the stream
  }
}

这有助于防止潜在的资源泄漏.

Javascript相关问答推荐

判断现代浏览器中的点击是否由touch 触发

使用Angular 17计算从生日日期起的年、月、天

如何将剧作家请求对象转换为字符串,因为它只提供promise ?

Vue v模型检测父参考更改

TypScript:根据共享属性对项目进行分组并为其分配groupID

如果被1个Phaser JS抵消,我的倾斜碰撞

在分区内迭代分区

如何获取转换字节的所有8位?

如何最好地从TypScript中的enum获取值

vscode扩展-webView Panel按钮不起任何作用

React 17与React 18中的不同setState行为

将本机导航路由react 到导航栏中未列出的屏幕?

无法检测卡片重叠状态的问题

使用JQuery单击元素从新弹出窗口获取值

如何在Node.js中排除导出的JS文件

钛中的onClick事件需要在两次点击之间等待几秒钟

一个实体一刀VS每个实体多刀S

将对象推送到数组会导致复制

如何在和IF语句中使用||和&;&;?

如何用javascript更改元素的宽度和高度?