摘要:但是一直一拖再拖。目前在做的是構建自己的代理池。那么我還需要利用這條代理信息去訪問百度或者其他網站驗證這個代理是否可用,可用則代理信息入庫,否則丟掉。得到則代表所有的請求都已完成。上說對象用于一個異步操作的最終完成或失敗及其結果值的表示。
背景
之前就有在GitHub上吹過一個牛:https://github.com/eternitysp... 打算做一個爬蟲,爬點東西。但是一直一拖再拖。最近離職在找工作。時間大把。這就開始折騰起來了。目前在做的是構建自己的代理池。
簡單來說,我需要去訪問提供免費代理的網站,然后把這些免費的代理信息驗證后入庫。
假設我現在訪問A頁面,里邊有m條代理數據。那么我還需要利用這m條代理信息去訪問百度或者其他網站驗證這個代理是否可用,可用則代理信息入庫,否則丟掉。但是利用代理去訪問百度是個異步的過程。我在什么時候知道這m條請求都完成了呢?
我想到的一種方法:定義m個變量初始值設置為0,異步請求成功后吧變量賦值為1,然后每個請求完成計算一下這m個變量的乘積。得到1則代表所有的請求都已完成。可是這種方法是不是麻煩了點。早就聽聞promise是es6的新花樣,可以解決這種多重回調的問題。于是就上MDN上文檔擼起來。
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://specialneedsforspecialkids.com/yun/89734.html
摘要:這么講,有點籠統,準確地說,應該是事件回調執行過程中,在主線程為空之后,異步代碼執行之前,所有通過注冊的異步代碼都是用宏任務。 寫文章不容易,點個贊唄兄弟專注 Vue 源碼分享,文章分為白話版和 源碼版,白話版助于理解工作原理,源碼版助于了解內部詳情,讓我們一起學習吧研究基于 Vue版本 【2.5.17】 如果你覺得排版難看,請點擊 下面鏈接 或者 拉到 下面關注公眾號也可以吧 【...
摘要:從最開始的到封裝后的都在試圖解決異步編程過程中的問題。為了讓編程更美好,我們就需要引入來降低異步編程的復雜性。異步編程入門的全稱是前端經典面試題從輸入到頁面加載發生了什么這是一篇開發的科普類文章,涉及到優化等多個方面。 TypeScript 入門教程 從 JavaScript 程序員的角度總結思考,循序漸進的理解 TypeScript。 網絡基礎知識之 HTTP 協議 詳細介紹 HTT...
摘要:從最開始的到封裝后的都在試圖解決異步編程過程中的問題。為了讓編程更美好,我們就需要引入來降低異步編程的復雜性。寫一個符合規范并可配合使用的寫一個符合規范并可配合使用的理解的工作原理采用回調函數來處理異步編程。 JavaScript怎么使用循環代替(異步)遞歸 問題描述 在開發過程中,遇到一個需求:在系統初始化時通過http獲取一個第三方服務器端的列表,第三方服務器提供了一個接口,可通過...
摘要:盡量把所有異步代碼放在一個宏微任務中,減少消耗加快異步代碼的執行。我們知道,如果一個異步代碼就注冊一個宏微任務的話,那么執行完全部異步代碼肯定慢很多避免頻繁地更新。中就算我們一次性修改多次數據,頁面還是只會更新一次。 寫文章不容易,點個贊唄兄弟專注 Vue 源碼分享,文章分為白話版和 源碼版,白話版助于理解工作原理,源碼版助于了解內部詳情,讓我們一起學習吧研究基于 Vue版本 【2.5...
摘要:作為對象原型鏈的終點。調用函數時,應該提供的參數沒有提供,該參數等于。它可以用于引用該函數的函數體內當前正在執行的函數。 一 JS 二 CSS 一 JS ==和===的區別 ===叫做嚴格運算符 ==叫做相等運算符嚴格運算符比較時不僅僅比較數值還要比較數據類型是否一樣相等運算符在比較相同類型的數據時,與嚴格相等運算符完全一樣。 在比較不同類型的數據時,相等運算符會先將數據進行類型轉換,...
閱讀 3422·2023-04-25 22:44
閱讀 926·2021-11-15 11:37
閱讀 1632·2019-08-30 15:55
閱讀 2639·2019-08-30 15:54
閱讀 1080·2019-08-30 13:45
閱讀 1430·2019-08-29 17:14
閱讀 1853·2019-08-29 13:50
閱讀 3402·2019-08-26 11:39