1. 程式人生 > >聊一聊Promise和Async

聊一聊Promise和Async

本文需要有一定的前端經驗。

Promise和Async屬於ES6的知識,主要為了解決各種複雜的非同步請求。

何為複雜呢?讓我舉個例子:

例子一:

小徐給小明和小紅佈置了網上作業,他想要收到小明和小紅都寫完作業的訊息一起審批。

下面我用ajax請求介面代表做作業的過程,介面回撥作為收到訊息。作業介面如下:

/pa/work?name=XXX

機智的我開始寫程式碼了:

方案一:

$.ajax({
    url: '/pa/work?name=小明',
    type: 'GET',
    success: function ( res ) {
        $.ajax({
            url: '/pa/work?name=小紅'
, type: 'GET', success: function ( res ) { console.log('我收到小明和小紅的作業都提交的訊息了,我要開始審批了'); } }) } })

上面的寫法跟實際的需求是不符的,我需要的是同時通知小明和小紅,讓他們同事做作業,結果寫成了先小明寫完作業了,再讓小紅寫作業。於是我絞盡腦汁想到了下面的辦法

方案二:

var xmMessage = false;
var xhMessage = false;

$.ajax({
    url: '/pa/work?name=小明'
, type: 'GET', success: function ( res ) { xmMessage = true; } }) $.ajax({ url: '/pa/work?name=小紅', type: 'GET', success: function ( res ) { xhMessage = true; } }) var clear = setInvervar( function () { if ( xmMessage == true && xhMessage == true
) { console.log('我收到小明和小紅的作業都提交的訊息了,我要開始審批了'); claerInvervar( clear ); } }, 500)

上面的程式碼就實現了我的需求,同時通知小明小紅讓他們一同寫作業,並且收到他倆的訊息第一時間進行審批。 但是需要我自己定義倆個變數,用定時器來監控小明和小紅的返回資訊。是很麻煩的。

那如何優雅的實現這個需求呢?這就需要用到Promise來了:

首先我需要將上面的ajax封裝成一個Promise:

function axios (name) {
    return new Promise( function ( resolve, reject ) {
        $.ajax({
            url: '/pa/work?name=' + name,
            type: 'GET',
            success: function ( res ) {
                resolve(res);
            },
            error: function (err){
                reject(err);
            }
        })   
    })
}

現在我們來實現功能:

Promise.all( [axios('小明'), axios('小紅')]).then ( function (value) {
    console.log('我收到小明和小紅的作業都提交的訊息,我要開始審批了');
})

怎麼樣乾淨簡潔,而且擴充套件方便。及時你後面再有小龜,小王…等等我都從容處理.(axios是一個網上封裝好的一個用外掛能夠運行於瀏覽器和node,我這裡只是為了舉個例子。)

例子二

我校要舉行三百米接力了,第一棒小徐,第二棒小紅,第三棒小王。

現在我用ajax請求介面代表跑步的過程,用回撥代表傳棒成功。跑步介面如下:

/pa/run?name=XXX

機智的我開始寫程式碼了:

$.ajax({
    url: '/pa/run?name=小徐',
    type: 'GET',
    success: function ( res ) {
        console.log('小徐將棒子傳遞給小紅');
        $.ajax({
            url: '/pa/run?name=小紅',
            type: 'GET',
            success: function ( res ) {
                console.log('小紅將棒子傳遞給小王');
                $.ajax({
                    url: '/pa/run?name=小王',
                    type: 'GET',
                    success: function ( res ) {
                        console.log('小王完成了比賽獲得第一名!');
                    }
                })
            }
        })
    }
})

這一堆程式碼幾乎是沒有什麼邏輯,但是我估計讀一次就會被噁心一次。

那如何優雅的實現這個需求呢?這就需要用到Async了:

首先我需要將上面的ajax封裝成一個Promise:

function axios (name) {
    return new Promise( function ( resolve, reject ) {
        $.ajax({
            url: '/pa/run?name=' + name,
            type: 'GET',
            success: function ( res ) {
                resolve(res);
            },
            error: function (err){
                reject(err);
            }
        })   
    })
}

現在我們來實現功能:

async function () {
    var xx = await axios('小徐');
    console.log('小徐將棒子傳遞給小紅');
    var xh = await axios('小紅');
    console.log('小紅將棒子傳遞給小王');
    var xw = await axios('小紅');
    console.log('小王完成了比賽獲得第一名!');
}

使用async就能夠輕易的寫出來按順序執行的非同步程式碼,程式碼可讀性非常高。

Promise和Async的功能遠遠沒有上面那麼一丟丟,能幹的事情還有很多。之所以列舉上面的這倆個例子是因為他們在前端出現的場景也是很頻繁的,後端(node)就更不應說了。

看了我的文章對他們感興趣了可以看一下阮一峰老師寫的開源的es6的書,上面對Promise和Async的介紹都很詳細。

覺得我寫的還行可以關注我的公眾號哦
吵吵日記

相關推薦

PromiseAsync

本文需要有一定的前端經驗。 Promise和Async屬於ES6的知識,主要為了解決各種複雜的非同步請求。 何為複雜呢?讓我舉個例子: 例子一: 小徐給小明和小紅佈置了網上作業,他想要收到小明和小紅都寫完作業的訊息一起審批。 下面我用ajax請

【轉載】C#的Equals()GetHashCode()方法

table rule != tle 繼承 操作符 內存 png blog 首先先談一下Equals()這個方法: Equals()方法,來自於Object,是我們經常需要重寫的方法。此方法的默認實現大概是這樣的: public virtual bool Equals(obj

( 轉 ) C#的Equals()GetHashCode()方法

不同 持久性 自己 今天 特殊 周期 htm type eth 博客創建一年多,還是第一次寫博文,有什麽不對的地方還請多多指教。 關於這次寫的內容可以說是老生長談,百度一搜一大堆。大神可自行繞路。 最近在看Jeffrey Richter的CLR Via C#,在看到Get

promise的前世今生

在操作 審核 person ces require 子集 描述 下一個 delete   promise的概念已經出現很久了,瀏覽器、nodejs都已經全部實現promise了。現在來聊,是不是有點過時了?   確實,如果不扯淡,這篇隨筆根本不會有太多內容。所以,我就盡可能

web開發的前後端分離頁碼分離

我一直對web非常感興趣,在這個APP為主導的時代,我依然覺得未來的社會是屬於瀏覽器的。 不過今天不說瀏覽器,說說web中的前後端分離和頁碼分離,可能題目看起來怪怪的,因為【前後端分離】和【頁碼分離】看上去是一個概念。 實際上,前後端分離指的是後端程式碼和前端程式碼的分離,

PV併發、以及計算web伺服器的數量的方法

幾個概念 網站流量是指網站的訪問量,用來描述訪問網站的使用者數量以及使用者所瀏覽的網頁數量等指標,常用的統計指標包括網站的獨立使用者數量、總使用者數量(含重複訪問者)、網頁瀏覽數量、每個使用者的頁面瀏覽數量、使用者在網站的平均停留時間等。 網站訪問量的常用衡量標準:獨立訪���(UV) 和 綜合瀏覽量(PV

webpack 中的 preloading Prefetching

聊一聊 webpack 中的 preloading 和 Prefetching 提到 Preloading 和 Prefetching 就不得不先說一下程式碼分割,通過下面的例子我們來說明為什麼需要程式碼分割? // index.js import _ from 'lodash'; // 假設大小為 1 MB

從千萬級資料查詢來索引結構資料庫原理

在日常工作中我們不可避免地會遇到慢SQL問題,比如筆者在之前的公司時會定期收到DBA彪哥發來的Oracle AWR報告,並特別提示我某條sql近階段執行明顯很慢,可能要優化一下等。對於這樣的問題通常大家的第一反應就是看看sql是不是寫的不合理啊諸如:*“避免使用in和not in,否則可能會導致全表掃描”“

JSONP影象Ping的區別

## JSONP 在講 JSONP 之前需要再來回顧一下在頁面上使用 script 引入外部的 js 檔案時到底引入了什麼? 先建立一個 index.js 檔案。 ```js console.log(123) ``` 再建立一個 index.html 檔案。 ```html

啥都不會的我自學Linux系統的歷程

計算機專業 linux論壇 服務器 知識點 嵌入式 Linux大家都不陌生,我是在大三的時候開始接觸Linux,上課的時候一位給我們上課的老師閑聊的時候說,你們計算機專業的學生要好好去學Linux,對於你們以後發展或者是就業都很有幫助。 開始的時候是一種從眾心理,慢慢的學習中發現自己越來越

Vue實例與生命周期運行機制

思維 mod images mic import mvvm 方法 add char Vue的實例是Vue框架的入口,擔任MVVM中的ViewModel角色,所有功能的實現都是圍繞其生命周期進行的,在生命周期的不同階段調用對應的鉤子函數可以實現組件數據管理和DOM渲染兩大重要

很認真的程序員的自我修養

很大的 溝通 數據庫查詢 職業 xxx 話題 必備 小學 lol 首先要談的是,今天的話題所聊的程序員包含哪些人? 在中國,寫程序,不僅僅是一種興趣,更多的時候,還是一種普通職業和謀生工具 大公司有厲害的程序員,優秀的架構師,但大量的小公司也有很多普通的程序員。在我這些

[系列]前端存儲那些事兒

我們 老朋友 必須 獲取 sql 壓力 做了 lan read https://segmentfault.com/a/1190000005927232 歡迎大家收看聊一聊系列,這一套系列文章,可以幫助前端工程師們了解前端的方方面面(不僅僅是代碼):https://seg

共享單車

高峰 地鐵站 中學生 電商 吐槽 活動 存在 http ... 1.共享單車的模式用戶交押金,然後騎車,按照騎車時間進行計費。其實,嚴格意義上來講,這還並不屬於共享經濟,更像分時租賃。 2、共享單車的用戶人群 & 特征用戶人群:80後、90後的低頻打車人群,

分布式鎖的設計

src set 可用性 slave 共享資源 get 處理過程 res 指定 起因 前段時間,看到redis作者發布的一篇文章《Is Redlock safe?》,Redlock是redis作者基於redis設計的分布式鎖的算法。文章起因是有一位分布式的專家寫了一篇文章《H

我的阿裏雲ECS雲主機

工作者 資料 linux系統 tom ecs 進行 http 感覺 com javaweb學習有段時間了,期間也編寫了一些自己的小webapp應用,但是都是發布在我們自己的個人pc上的. 於是我在想:怎麽樣讓自己的項目可以發到公網上面去,讓朋友們能夠來訪問?   我首先想到

Android 6.0 的運行時權限

con alert 打電話 target 告訴 分享 ttf alt toast 聊一聊 Android 6.0 的運行時權限 權限一刀切 棉花糖運行時權限 權限的分組 正常權限 正常權限列表 特殊權限 請求SYSTEM_ALERT_WINDOW 請求WRITE

Javasript繼承

兩個 || this指向 type屬性 中國 什麽 aso ldo markdown ??前前後後已經快寫了2年左右javaScript,剛開始只是簡單用於一些表單驗證和操作dom節點,並沒有深入的使用,隨著漸漸的深入,開始不想去寫重復的代碼(懶的開始),從而寫簡單的繼承,

(五)深Copy與淺Copy

otto list int print 技術分享 作用 code height 工廠 一、關於淺copy與深copy 首先說明一下: 在python中,賦值其實就是對象的引用,變量就是對象的一個標簽,如果把內存對象比喻成一個個房間,那麽變量就是門牌號。 深copy與淺

2D地圖的迷霧效果

png char 一段 行數據 編程經驗 lan get 第一個 色值 在經歷了17年諸般變動後,現在到了2018年。懷舊是因為之前幾年發生太多,好與不好都已過去,17年迎來新的開始,所以也就有了後來些許感慨,有機會再說說這些行業感受了。今天先讓我們專註於川最新解決的實際項