You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PureScript中如何等待子进程退出?

如何等待Node.js子进程退出后读取stdout?

在使用Node.ChildProcess模块执行命令时,若直接在写入stdin后读取stdout,可能因子进程尚未完成输出导致读取不到内容。以cat命令为例,原代码中Stream.readString仅尝试读取一次数据块,此时cat还未将内容写入stdout,因此返回"nothing"。

解决方案:读取完整的stdout流

Stream.readAllString会等待stdout流结束(子进程关闭输出流时触发),并返回所有输出内容,替代单次读取的Stream.readString即可解决问题。修改后的代码如下:

module Main where

import Prelude

import Effect (Effect)
import Effect.Console (log)
import Node.ChildProcess as Proc
import Node.Encoding (Encoding(UTF8))
import Node.Stream as Stream

main :: Effect Unit
main = do
  child <- Proc.spawn "cat" []
  let stdin' = Proc.stdin child
  _ <- Stream.writeString stdin' UTF8 "hello"
  _ <- Stream.end stdin'

  -- 等待stdout流结束并读取全部内容
  output <- Stream.readAllString (Proc.stdout child) UTF8
  log output

显式等待子进程退出(可选)

若需要明确等待子进程退出事件后再读取输出,可结合Proc.onExit与异步操作实现:

module Main where

import Prelude

import Effect (Effect)
import Effect.Async (async, await)
import Effect.Console (log)
import Node.ChildProcess as Proc
import Node.Encoding (Encoding(UTF8))
import Node.Stream as Stream

main :: Effect Unit
main = do
  child <- Proc.spawn "cat" []
  let stdin' = Proc.stdin child
  _ <- Stream.writeString stdin' UTF8 "hello"
  _ <- Stream.end stdin'

  -- 等待子进程退出
  _ <- async \resolve -> Proc.onExit child \_ -> resolve unit

  -- 读取全部stdout内容
  output <- Stream.readAllString (Proc.stdout child) UTF8
  log output

说明

  • Stream.readString仅读取当前可用的单个数据块,无法保证获取子进程的全部输出;Stream.readAllString会持续读取直到流结束,确保拿到完整结果。
  • 子进程退出时会自动关闭stdout流,因此readAllString会在进程完成输出后返回数据。

内容的提问来源于stack exchange,提问作者Hi-Angel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 23:42:40