Promise-大白話之[按需學習]

背景

以前就有在GitHub上吹過一個牛:https://github.com/eternitysp... 打算作一個爬蟲,爬點東西。可是一直一拖再拖。最近離職在找工做。時間大把。這就開始折騰起來了。目前在作的是構建本身的代理池。
簡單來講,我須要去訪問提供免費代理的網站,而後把這些免費的代理信息驗證後入庫。
假設我如今訪問A頁面,裏邊有m條代理數據。那麼我還須要利用這m條代理信息去訪問百度或者其餘網站驗證這個代理是否可用,可用則代理信息入庫,不然丟掉。可是利用代理去訪問百度是個異步的過程。我在何時知道這m條請求都完成了呢?
我想到的一種方法:定義m個變量初始值設置爲0,異步請求成功後吧變量賦值爲1,而後每一個請求完成計算一下這m個變量的乘積。獲得1則表明全部的請求都已完成。但是這種方法是否是麻煩了點。早就聽聞promise是es6的新花樣,能夠解決這種多重回調的問題。因而就上MDN上文檔擼起來。git

Promise

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

相關文章
相關標籤/搜索