如何在不阻塞主循环的情况下使用JSONStream stringify

时间:2019-08-27 06:04:51

标签: javascript node.js json stream jsonstream

我想使用JSONStream库对一个大型javascript对象进行字符串化。它的工作速度非常快,但问题是仍然阻塞了我的主循环。那是因为我将整个对象写在一个write()上。

但是,即使我例如遍历and数组的元素,并一一写入它们,它仍然会阻塞。我认为这不是一个好的解决方案,因为如果我拥有一个只有一个键和一个非常大的值的对象该怎么办。

const stringify = (obj) => {
  return new Promise((resolve, reject) => {
    const stream = JSONStream.stringify();
    const result = [];

    stream.on('data', (data) => {
      result.push(data);
    });

    stream.on('error', (err) => {
      reject(err);
    });

    stream.on('end', () => {
      resolve(result.join(''));
    });

    if (Array.isArray(obj)) {
      for (const elem of obj) {
        stream.push(elem);
      }
    }
    stream.end();
  });
};

我通过将Interval设置为0ms来增加计数器来检查循环是否被阻塞。最后,计数器显示了我在拉线循环之外获得了多少滴答声。

let counter = 0;
const interval = setInterval(() => {
  counter++;
}, 0);
await json.stringify(obj);
clearInterval(interval);

0 个答案:

没有答案