问答

node.js怎么强制结束一个异步操作?

作者:admin 2021-10-05 我要评论

问题是这么提出来的: 想用nodejs开发一个类似与爬虫的东西,爬取功能的实现都是用库完成的,提供的方法大概是这样的: function spider(url) { return new Prom...

在说正事之前,我要推荐一个福利:你还在原价购买阿里云、腾讯云、华为云服务器吗?那太亏啦!来这里,新购、升级、续费都打折,能够为您省60%的钱呢!2核4G企业级云服务器低至69元/年,点击进去看看吧>>>)

问题是这么提出来的:
想用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的方法

###
  1. 如果你想要中断请求,需要寻找类似 .abort() 的方法
  2. 如果你希望超时就不要了,可以在每个请求外面套一个 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);

版权声明:本文转载自网络,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本站转载出于传播更多优秀技术知识之目的,如有侵权请联系QQ/微信:153890879删除

相关文章
  • node.js怎么强制结束一个异步操作?

    node.js怎么强制结束一个异步操作?

  • Postman请求不到

    Postman请求不到

  • 请教一个正则匹配的问题

    请教一个正则匹配的问题

  • 求助! 用 微信播放h5视频(video.js )

    求助! 用 微信播放h5视频(video.js )

腾讯云代理商
海外云服务器