博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Promise-大白话之[按需学习]
阅读量:7231 次
发布时间:2019-06-29

本文共 2034 字,大约阅读时间需要 6 分钟。

背景

之前就有在GitHub上吹过一个牛: 打算做一个爬虫,爬点东西。但是一直一拖再拖。最近离职在找工作。时间大把。这就开始折腾起来了。目前在做的是构建自己的代理池。

简单来说,我需要去访问提供免费代理的网站,然后把这些免费的代理信息验证后入库。
假设我现在访问A页面,里边有m条代理数据。那么我还需要利用这m条代理信息去访问百度或者其他网站验证这个代理是否可用,可用则代理信息入库,否则丢掉。但是利用代理去访问百度是个异步的过程。我在什么时候知道这m条请求都完成了呢?
我想到的一种方法:定义m个变量初始值设置为0,异步请求成功后吧变量赋值为1,然后每个请求完成计算一下这m个变量的乘积。得到1则代表所有的请求都已完成。可是这种方法是不是麻烦了点。早就听闻promise是es6的新花样,可以解决这种多重回调的问题。于是就上MDN上文档撸起来。

Promise

MDN上说:Promise 对象用于一个异步操作的最终完成(或失败)及其结果值的表示。(简单点说就是处理异步请求。我们经常会做些承诺,如果我赢了你就嫁给我,如果输了我就嫁给你之类的诺言。这就是promise的中文含义:诺言,一个成功,一个失败。)

呵呵,文绉绉的。还是上代码:

// 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是个什么玩意了。

接着在我们的爬虫项目里边应用了:

var proxyList= [{},{},{},{},{}];  // 一个空对象代表一个代理信息var promiseList = [];for(let i = 1;i
{ // 这里我们利用setTimeout来模拟异步请求验证proxy的可用性 setTimeout(()=>{ Math.random() > 0.001 ? resolve() : reject() }) }); promiseList.push(promiseItem);}Promise.all(promiseList).then(res=> console.log('验证完毕,可以下一页了'))

到此,promise的实际应用就算告一段落了。

总结

感觉又多了一个装逼的姿势了。

转载地址:http://jkvfm.baihongyu.com/

你可能感兴趣的文章
XMPP开发环境的搭建
查看>>
Docker 数据卷,数据卷容器详细介绍
查看>>
使用rman备份到挂载的NFS目录,提示ORA-19504-27054报错
查看>>
通过 rsync 搭建 CentOS 本地 yum 源服务器
查看>>
hadoop hive 常见问题解决持续更新
查看>>
如何做不浮躁的人
查看>>
终端服务设施方案共享(Part3)
查看>>
linux的基本指令--第三节
查看>>
设置tomcat为https访问
查看>>
我的友情链接
查看>>
oracle的触发器和应用
查看>>
Docker实践(五):Docker Compose
查看>>
我的友情链接
查看>>
介绍几个jsp页面传对象的方法
查看>>
我的Jakarta+Commons
查看>>
Bootstrap的使用
查看>>
python设置文字输出颜色
查看>>
WARNING:tornado.access:403 GET /websocket (::1) 1.00ms
查看>>
cocos creator游戏适配这事
查看>>
AngularJS - contorller app module
查看>>