我需要下载约 5 万个网页,从中获取一些数据并将其放入变量中。
我将每个请求包装到 Promise 中,然后将Promise.all()
它们包装起来。我使用Request
图书馆。
简化代码:
const request = require('request');
const urls = [url1, url2, ...];
const promises = [];
urls.forEach(url => {
promises.push((resolve, reject) => {
request(url, (error, response, body) => {
if(error){ reject(error); return; }
// do something with page
resolve(someData);
});
});
});
Promise.all(promises.map(pr => new Promise(pr)))
.then((someDataArray)=>{ /* process data /* });
但是我收到ENFILE
异常,这代表系统中打开的文件太多(在我的桌面上打开文件的最大数量为 2048)。
我知道 Promises 在创建时执行,但我无法解决这个问题。
也许还有其他方法可以做到这一点?感谢您的回复。