提问者:小点点

为什么`react.rendertonodeStream`不屈服于事件循环?


我试图让React的RenderToStringRenderToStaticMarkup成为更好的公民,方法是让事件循环允许其他服务器请求查看,例如。

const React = require('react');
const { renderToNodeStream } = require('react-dom/server');

// Wrap `renderToNodeStream` in promise
const renderToStringAsync = node => {
  return new Promise((resolve, reject) => {
    let body = '';
    const stream = renderToNodeStream(node);
    // NOTE: we're turning the tap on full blast here, but I still expected it to yield
    stream.on('data', chunk => {
      console.log('Received chunk');
      body += chunk.toString();
    });
    stream.on('error', ex => {
      reject(ex);
    });
    stream.on('end', () => {
      resolve(body);
    });
  });
};

setTimeout(() => {
  console.log('Yielded to event loop');
}, 0)
await renderToStringAsync(largeRootNode);

我预料到了:

// Expect:
// Received chunk
// Yielded to event loop
// Received chunk
// Received chunk
// Received chunk
// Received chunk
// Received chunk
// Received chunk
// Received chunk
// Received chunk
// Received chunk

但我真的明白:

// Actual:
// Received chunk
// Received chunk
// Received chunk
// Received chunk
// Received chunk
// Received chunk
// Received chunk
// Received chunk
// Received chunk
// Yielded to event loop

我想知道它是否与.on('data')相关; 我知道它不能管理反压,但我一直以为它是异步的?

注意:我没有将响应传送到客户机,因为我需要等待呈现完成后才能确定状态代码; 我只是想使用RenderTonodeStream来改进node.js中的协作多任务)


共1个答案

匿名用户

Promise执行器是同步执行的,ReactDomNodeStreamRenderer也是同步执行的。 ReactDOMNodeStreamRender的_read方法没有异步组件,将根据Node中的方法约定同步调用。

简而言之,这里的整个代码块是同步执行的,不涉及同步。 流接口提供了异步执行的可能性,也使管道传输到一个确实异步写入的流更容易一些。

需要注意的是,流接口本身并不使任何操作都是异步的!