gpt4 book ai didi

javascript - 限制Node js中的Q promise 并发

转载 作者:数据小太阳 更新时间:2023-10-29 04:17:03 27 4
gpt4 key购买 nike

有什么方法可以限制在node js中一次执行的并发Q promise的数量吗?

我正在构建一个网络 scraper ,它必须请求和解析更多 3000 多个页面并且在没有限制的情况下我提出的一些请求没有及时得到响应,所以连接停止并且需要响应(html 代码)变得不可用。

为了解决这个问题,我发现限制请求的数量我的问题消失了。


我尝试了以下方法,但没有用:

我需要请求一个 url 数组,一次只做 1 个请求,当数组中的所有 url 都完成时,然后将结果返回一个数组。

function processWebsite() {
//computed by this stage
urls = [u1,u2,u3,u4,l5,u6,u7,u8,u9];

var promises = throttle(urls,1,myfunction);

// myfunction returns a Q promise and takes a considerable
// amount of time to resolve (approximately 2-5 minutes)

Q.all(promises).then(function(results){
//work with the results of the promises array
});
}

最佳答案

我会这样做,这将遍历每个 URL,构建一个 promise 链,在前一个完成时运行,并使用请求结果数组进行解析。

return urls.reduce(function(acc, url){
return acc.then(function(results)
return myfunction(url).then(function(requestResult){
return results.concat(requestResult)
});
});
}, Q.resolve([]));

你也可以把它变成一个助手:

var results = map(urls, myfunction);

function map(items, fn){
return items.reduce(function(acc, item){
return acc.then(function(results)
return fn(item).then(function(result){
return results.concat(result)
});
});
}, Q.resolve([])
}

请注意,bluebird promise 库有一个帮助程序来简化这种事情。

return Bluebird.map(urls, myfunction, {concurrency: 1});

关于javascript - 限制Node js中的Q promise 并发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26992767/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com