在nodejs命令行脚本中保持顺序

时间:2017-07-16 18:30:51

标签: javascript node.js io

我想在nodejs中编写代码,但我不知道如何实现它。我一直在阅读和搜索,但仍然不知道这样做的正确方法是什么。

问题如下:

  • 从stdin读取行
  • 对于每一行,启动http请求
  • 同时http
  • 必须有限制
  • 将已读取的行加上从http请求获取的一些数据写入stdout
  • 必须按顺序写入行

你无法阅读"所有"文件然后分割线:你必须一次处理一行,记住它的标准输入。你不知道什么时候输入会结束。

有没有人有一些如何解决这个问题的线索?我不知道如何继续。

2 个答案:

答案 0 :(得分:0)

你可以这样做:

const http = require('http');
const Promise = require('bluebird');
let arrayOfRequests = [];
process.stdin.on('data',  (data) => { 
    //get data from the stdin
    //then add the request to the array
    arrayOfRequests.push(http.get({}))

})

process.stdin.on('end', () => {
    Promise.all(arrayOfRequests)
    // use Promise .all to bundle all of the reuqest
    //then use the spread operator so you can use all of the reuqest In order
    .spread( (request1,request2,request3)  => {
        // do stuff
    })
})

仅供参考,该片段不起作用。

所以你正在做的是使用Node.js中内置的process.stdin。然后你捆绑所有的请求。每当用户取消程序时,您的请求将被提出。由于调用是异步的,因此您将它们放在一个数组中,然后运行Promsise.all并使用bluebird .spread运算符解构Promise.all并获取值。

答案 1 :(得分:0)

到目前为止,我已经为nodejs中的生产者 - 消费者问题找到了这个解决方案,其中生产者在队列中有可用空间之前不会生成更多数据。

这是队列的代码,基于block-queuehttps://gist.github.com/AlvaroMaceda/8a933a317fed3fd4691fd5eda3e60c5e

要使用阻止队列,请使用3个参数创建阻塞队列:

  1. 并发运行的任务数
  2. “推送”功能。当队列作为参数时,它将被调用 需要更多数据。该任务将添加标识符。
  3. “任务”功能。它将使用创建的标识符进行调用 “推”功能。
  4. 只有在需要更多数据时,队列才会调用“push”。例如,如果有五个任务在运行并且最多创建了5个并发任务,则在其中一个任务结束之前不会调用“push”。

    这是如何使用它的一个例子:

    "use strict";
    const queue = require('./block-queue');
    
    const CONCURRENCY = 5;
    const WORKS_TO_LAUNCH = 10;
    const TIMEOUT = 200;
    
    let i = 1;
    let q = queue(CONCURRENCY, doSomethingAsync, putMoreData );
    
    function putMoreData(queue) {
        if (++i <= WORKS_TO_LAUNCH) {
            console.log('Pushing to queue');
            queue.push(i);
        }
    }
    function doSomethingAsync(task, done) {
        setTimeout(function() {
            console.log('done ' + task);
            done();
        }, 1000 + task * TIMEOUT);
    }
    
    q.push(i);
    

    我不解决这个问题,因为我不知道是否有更简单的方法,我想要完成整个解决方案,不知道在处理这个和流时我是否会发现一些问题