问题是这么提出来的:
想用nodejs开发一个类似与爬虫的东西,爬取功能的实现都是用库完成的,提供的方法大概是这样的:
function spider(url) {
return new Promise... // 之类的操作
}
然后外面套了一个循环
urls.forEach(url => {
result.push(spider(url))
})
Promise.all(result) // 在这里停顿,,
在等数据的时候总是可能会有一些地方爬的比较慢,于是promise.all就直接卡住了。我试了一些直接在spider外面套一层promise,然后settimeout
result.push(new Promise((resolve,reject) => {
setTimeOut(()=>resolve())
spider(url)).then(res=>resolve(res))
})
现在问题是解决了,但是发现貌似这个spider函数还是在运行,如果这个程序要运行很长的时间,会不会影响性能?因为是别人的库,如果不直接去修改代码怎么结束spider函数的运行?
我自己想了一个很low的方法,用child_process去运行,然后直接超时直接掐死子进程,但是理性告诉我这个开销很大。
作为一个刚接触nodejs的大一新生,能不能讲的尽量我能听懂,万分感谢!!
###Promise.race
###你需要调用那个类库提供的类似XMLHttpRequest.abort()
之类的abort
的方法
- 如果你想要中断请求,需要寻找类似
.abort()
的方法 - 如果你希望超时就不要了,可以在每个请求外面套一个
Promise.race
,超过你想要的时间,就自动放弃,类似这样:
let result = await urls.map(url => {
const timeout = new Promise(resolve => {
setTimeout(function () {
resolve({
code: 1,
message: 'Timeout',
});
}, 30000)); // 30s
});
return Promise.race([timeount, spider(url)]);
});
// 过滤掉放弃的请求
result = result.filter(({code}) => !code || code !== 1);