我想在nodejs中编写代码,但我不知道如何实现它。我一直在阅读和搜索,但仍然不知道这样做的正确方法是什么。
问题如下:
你无法阅读"所有"文件然后分割线:你必须一次处理一行,记住它的标准输入。你不知道什么时候输入会结束。
有没有人有一些如何解决这个问题的线索?我不知道如何继续。
答案 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-queue:https://gist.github.com/AlvaroMaceda/8a933a317fed3fd4691fd5eda3e60c5e
要使用阻止队列,请使用3个参数创建阻塞队列:
只有在需要更多数据时,队列才会调用“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);
我不解决这个问题,因为我不知道是否有更简单的方法,我想要完成整个解决方案,不知道在处理这个和流时我是否会发现一些问题