以前就有在GitHub上吹过一个牛:https://github.com/eternitysp... 打算作一个爬虫,爬点东西。可是一直一拖再拖。最近离职在找工做。时间大把。这就开始折腾起来了。目前在作的是构建本身的代理池。
简单来讲,我须要去访问提供免费代理的网站,而后把这些免费的代理信息验证后入库。
假设我如今访问A页面,里边有m条代理数据。那么我还须要利用这m条代理信息去访问百度或者其余网站验证这个代理是否可用,可用则代理信息入库,不然丢掉。可是利用代理去访问百度是个异步的过程。我在何时知道这m条请求都完成了呢?
我想到的一种方法:定义m个变量初始值设置为0,异步请求成功后吧变量赋值为1,而后每一个请求完成计算一下这m个变量的乘积。获得1则表明全部的请求都已完成。但是这种方法是否是麻烦了点。早就听闻promise是es6的新花样,能够解决这种多重回调的问题。因而就上MDN上文档撸起来。git
MDN上说:Promise 对象用于一个异步操做的最终完成(或失败)及其结果值的表示。(简单点说就是处理异步请求。咱们常常会作些承诺,若是我赢了你就嫁给我,若是输了我就嫁给你之类的诺言。这就是promise的中文含义:诺言,一个成功,一个失败。)
呵呵,文绉绉的。仍是上代码:es6
// Promise 接受两个参数 // resolve: 异步事件成功时调用(表白成功) // reject: 异步事件失败时调用(表白失败) var Tom = new Promise((resolve, reject) => { // 获取表白结果 if (表白().result === '表白成功') { // 反馈 resolve(表白().girlName) } else { reject('小伙伴们,我 Tom 表白被拒了') } }) // 随机一个随机表白方法,返回表白结果和表白对象 function 表白() { return { girlName:Math.random() > 0.5 ? '小红' : '花花', result:Math.random() > 0.5 ? '表白成功' : '表白被拒' } } // 表白完毕和小伙伴们分享表白结果 Tom.then(res=> console.log('小伙伴们,我表白'+ res +'成功了') ) // 分享表白成功 .catch(res=> console.log(res) ) // 分享表白失败 // 听Tom说打算表白,Jim也要表白 var Jim = new Promise((resolve, reject) => { // 获取表白结果 if (表白().result === '表白成功') { // 反馈 resolve(表白().girlName) } else { reject('小伙伴们,我 Jim 表白被拒了') } }) Jim.then(res=> console.log('小伙伴们,我表白'+ res +'成功了') ) // 分享表白成功 .catch(res=> console.log(res) ) // 分享表白失败 // 那么问题来了,咱们怎么知道 Tom 还 Jim 都表白成功了,而后开一个party庆祝一下呢 Promise.all([Tom,Jim]) .then(res=> console.log(res)) // [Tom表白对象,Jim表白对象] .catch(res=> console.log(res)); // 第一个表白失败的对象
看到这里是否是大概已经知道promise是个什么玩意了。
接着在咱们的爬虫项目里边应用了:github
var proxyList= [{},{},{},{},{}]; // 一个空对象表明一个代理信息 var promiseList = []; for(let i = 1;i<proxyList.length;i++){ let promiseItem = new Promise((resolve,reject)=>{ // 这里咱们利用setTimeout来模拟异步请求验证proxy的可用性 setTimeout(()=>{ Math.random() > 0.001 ? resolve() : reject() }) }); promiseList.push(promiseItem); } Promise.all(promiseList).then(res=> console.log('验证完毕,能够下一页了'))
到此,promise的实际应用就算告一段落了。spring
感受又多了一个装逼的姿式了。promise