如何控制从节点中的流发起的异步http客户端请求的数量?

时间:2015-06-02 00:43:44

标签: javascript node.js

我想阅读大量的二进制数据流,将其分成更小的部分并执行PUT。

data.pipe(new BlockStream(1024*1024)).pipe(through(success, end))

function success(data) {
    var params = {/*host, port, etc...*/
    var req = http.request(params, (e, r) => {/*handle response*/})
    req.push(data)
    req.end()
}

function end() {cb()}

理想情况下,我希望在移动到下一个请求之前完成请求,同时不阻止执行其他JS代码。有人能够指出我正确的方向吗?

1 个答案:

答案 0 :(得分:1)

看起来你正在使用through。您可以使用pauseresume方法来控制数据流:

var inProgress = 0;
var MAX_IN_PROGRESS = 5; //or whatever number

data.pipe(new BlockStream(1024*1024)).pipe(through(success, end))

function success(data) {
    var params = {/*host, port, etc...*/
    inProgress++;
    if(inProgress == MAX_IN_PROGRESS) {
        this.pause();
    }
    var that = this;
    var req = http.request(params, (e, r) => {/*handle response*/})
    req.push(data)
    req.end(function() {
        inProgress--;
        if(that.paused) {
            that.resume();
        }
    });
}

function end() {cb()}

我们在这里做的是记录当前正在进行的请求数量。当我们开始一个时,我们会暂停,如果这会让我们达到最大数字,当我们完成一个时,如果我们当前暂停,我们会恢复。