资讯专栏INFORMATION COLUMN

Promise-大白话之[按需学习]

spacewander / 2969人阅读

摘要:但是一直一拖再拖。目前在做的是构建自己的代理池。那么我还需要利用这条代理信息去访问百度或者其他网站验证这个代理是否可用,可用则代理信息入库,否则丢掉。得到则代表所有的请求都已完成。上说对象用于一个异步操作的最终完成或失败及其结果值的表示。

背景

之前就有在GitHub上吹过一个牛:https://github.com/eternitysp... 打算做一个爬虫,爬点东西。但是一直一拖再拖。最近离职在找工作。时间大把。这就开始折腾起来了。目前在做的是构建自己的代理池。
简单来说,我需要去访问提供免费代理的网站,然后把这些免费的代理信息验证后入库。
假设我现在访问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的实际应用就算告一段落了。

总结

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/89734.html

相关文章

  • 【Vue原理】NextTick - 源码版 宏微任务的抉择

    摘要:这么讲,有点笼统,准确地说,应该是事件回调执行过程中,在主线程为空之后,异步代码执行之前,所有通过注册的异步代码都是用宏任务。 写文章不容易,点个赞呗兄弟专注 Vue 源码分享,文章分为白话版和 源码版,白话版助于理解工作原理,源码版助于了解内部详情,让我们一起学习吧研究基于 Vue版本 【2.5.17】 如果你觉得排版难看,请点击 下面链接 或者 拉到 下面关注公众号也可以吧 【...

    raise_yang 评论0 收藏0
  • JS笔记

    摘要:从最开始的到封装后的都在试图解决异步编程过程中的问题。为了让编程更美好,我们就需要引入来降低异步编程的复杂性。异步编程入门的全称是前端经典面试题从输入到页面加载发生了什么这是一篇开发的科普类文章,涉及到优化等多个方面。 TypeScript 入门教程 从 JavaScript 程序员的角度总结思考,循序渐进的理解 TypeScript。 网络基础知识之 HTTP 协议 详细介绍 HTT...

    rottengeek 评论0 收藏0
  • JavaScript 异步

    摘要:从最开始的到封装后的都在试图解决异步编程过程中的问题。为了让编程更美好,我们就需要引入来降低异步编程的复杂性。写一个符合规范并可配合使用的写一个符合规范并可配合使用的理解的工作原理采用回调函数来处理异步编程。 JavaScript怎么使用循环代替(异步)递归 问题描述 在开发过程中,遇到一个需求:在系统初始化时通过http获取一个第三方服务器端的列表,第三方服务器提供了一个接口,可通过...

    tuniutech 评论0 收藏0
  • 【Vue原理】NextTick - 源码版 独立自身

    摘要:尽量把所有异步代码放在一个宏微任务中,减少消耗加快异步代码的执行。我们知道,如果一个异步代码就注册一个宏微任务的话,那么执行完全部异步代码肯定慢很多避免频繁地更新。中就算我们一次性修改多次数据,页面还是只会更新一次。 写文章不容易,点个赞呗兄弟专注 Vue 源码分享,文章分为白话版和 源码版,白话版助于理解工作原理,源码版助于了解内部详情,让我们一起学习吧研究基于 Vue版本 【2.5...

    刘东 评论0 收藏0
  • 前端面经整理JS和CSS

    摘要:作为对象原型链的终点。调用函数时,应该提供的参数没有提供,该参数等于。它可以用于引用该函数的函数体内当前正在执行的函数。 一 JS 二 CSS 一 JS ==和===的区别 ===叫做严格运算符 ==叫做相等运算符严格运算符比较时不仅仅比较数值还要比较数据类型是否一样相等运算符在比较相同类型的数据时,与严格相等运算符完全一样。 在比较不同类型的数据时,相等运算符会先将数据进行类型转换,...

    stonezhu 评论0 收藏0

发表评论

0条评论

spacewander

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<