最新消息: 电脑我帮您提供丰富的电脑知识,编程学习,软件下载,win7系统下载。

Next.js:如果子进程没有任何数据要返回怎么办?

IT培训 admin 4浏览 0评论

Next.js:如果子进程没有任何数据要返回怎么办?

我正在使用Next.js管道系统调用。代码看起来像这样(不完全是这样,但这很简单,足以说明我在做什么):

export async function find(file, searchTerm) {

    const cat = execFile('cat', [file], {maxBuffer: 1024 * 1024});
    const grep = execFile('grep', [searchTerm], {maxBuffer: 1024 * 1024});
    cat.stdout.pipe(grep.stdin);

    return new Promise((resolve, reject) => {
        grep.stdout.on('data', async (d) => {
            setTimeout(() => resolve(d.toString().trim()), 100)
        });
    });
}

请注意,有两个过程:

  • cat
  • grep

cat.stdout用管道输送到grep.stdin,当grep.stdout收到data时,整个函数返回Promise

一切都很好。问题是,如果grepsearchTerm返回的结果中找不到cat,则不调用grep.stdout.on('data', ...的回调,整个链只是挂起。

在制作中,我有一个抽象,可以让我将任意数量的进程链接在一起(如上所述从execFile开始)。

有没有办法检测链中的任何进程是否返回“无”,并且只是沿着管道发送“无”(例如空字符串)?

谢谢。

回答如下:

您可以在此处使用“退出”事件。

子进程结束后会发出'exit'事件。如果进程退出,则代码是进程的最终退出代码,否则为null。如果由于接收到信号而终止该过程,则signal是信号的字符串名称,否则为null。其中一个将始终为非null。

因此,您可以在发生此事件时拒绝承诺。

更多信息:https://nodejs/api/child_process.html#child_process_event_exit

Next.js:如果子进程没有任何数据要返回怎么办?

我正在使用Next.js管道系统调用。代码看起来像这样(不完全是这样,但这很简单,足以说明我在做什么):

export async function find(file, searchTerm) {

    const cat = execFile('cat', [file], {maxBuffer: 1024 * 1024});
    const grep = execFile('grep', [searchTerm], {maxBuffer: 1024 * 1024});
    cat.stdout.pipe(grep.stdin);

    return new Promise((resolve, reject) => {
        grep.stdout.on('data', async (d) => {
            setTimeout(() => resolve(d.toString().trim()), 100)
        });
    });
}

请注意,有两个过程:

  • cat
  • grep

cat.stdout用管道输送到grep.stdin,当grep.stdout收到data时,整个函数返回Promise

一切都很好。问题是,如果grepsearchTerm返回的结果中找不到cat,则不调用grep.stdout.on('data', ...的回调,整个链只是挂起。

在制作中,我有一个抽象,可以让我将任意数量的进程链接在一起(如上所述从execFile开始)。

有没有办法检测链中的任何进程是否返回“无”,并且只是沿着管道发送“无”(例如空字符串)?

谢谢。

回答如下:

您可以在此处使用“退出”事件。

子进程结束后会发出'exit'事件。如果进程退出,则代码是进程的最终退出代码,否则为null。如果由于接收到信号而终止该过程,则signal是信号的字符串名称,否则为null。其中一个将始终为非null。

因此,您可以在发生此事件时拒绝承诺。

更多信息:https://nodejs/api/child_process.html#child_process_event_exit

发布评论

评论列表 (0)

  1. 暂无评论