背景之前在GitHub上吹牛:https://github.com/eternitysp...打算做一个爬虫,爬一些东西。但它一直在拖延。最近辞职找工作。很多时间。这就开始折腾了。我目前正在做的是构建我自己的代理池。简单来说,我需要访问一个提供免费代理的网站,然后将免费代理的信息核实后存入数据库。假设我现在访问页面A,里面有m条代理数据。那我还需要用这m条代理信息去百度或者其他网站验证代理是否可用。如果可用,则将代理信息存储在数据库中,否则将被丢弃。但是使用代理访问百度是一个异步过程。什么时候才能知道m个请求都完成了?我想到的一个方法:定义m个变量的初值,设置为0,异步请求成功后,将变量赋值为1,然后在每次请求完成后计算m个变量的乘积。得到1表示所有请求都已完成。不过这个方法是不是有点麻烦?早就听说promise是es6的新trick,可以解决多次回调的问题。所以我去了MDN上的文档并找到了它。PromiseMDN说:Promise对象用来表示一个异步操作的最终完成(或失败)及其结果值。(简单的说就是处理异步请求,我们经常会做一些承诺,如果我赢了你嫁给我,如果我输了我嫁给你等等承诺。这就是promise的中文意思:承诺,一次成功,一次失败。)呵呵,很有礼貌。还是上面的代码://Promise接受两个参数//resolve:异步事件成功时调用(表白成功)//reject:异步事件失败时调用(表白失败)varTom=newPromise((resolve,reject)=>{//获取表白结果if(confession().result==='表白成功'){//反馈resolve(confession().girlName)}else{reject('朋友们,我的汤姆表白被拒绝了')}})//一个随机表白方法,返回表白结果和表白对象functionconfession(){return{girlName:Math.random()>0.5?'小红':'花花',结果:Math.random()>0.5?'表白成功':'表白被拒绝'}}//表白后,将表白结果分享给好友Tom.then(res=>console.log('好友,我表白'+res+'成功'))//分享confessionsucceeded.catch(res=>console.log(res))//分享告白失败//听到Tom要告白,Jim也告白varJim=newPromise((resolve,reject)=>{//获取告白resultif(confession().result==='confessionsuccess'){//Feedbackresolve(confession().girlName)}else{reject('朋友们,我的Jim告白被拒绝了Rejected')}})Jim.then(res=>console.log('朋友们,我表白了'+res+'成功'))//分享表白成功catch(res=>console.log(res))//分享表白失败//那么问题来了,我们怎么知道假设汤姆和吉姆都告白成功了,然后开派对庆祝一下Promise.all([Tom,Jim]).then(res=>console.log(res))//[汤姆的告白对象,吉姆的告白对象].catch(res=>console.log(res));//第一个表白失败的对象看到这里大概已经知道promise是什么了,然后应用到我们的爬虫项目中:varproxyList=[{},{},{},{},{}];//一个空对象代表一个代理信息varpromiseList=[];for(leti=1;i
