大家好瓣距,我是IT修真院成都分院第8期的學員,一枚正直純潔善良的WEB前端程序員代咸。今天給大家分享一下閉包是什么蹈丸,用處如何。
1.背景介紹
什么是promise?
Promise 是異步編程的一種解決方案逻杖,比傳統(tǒng)的解決方案——回調(diào)函數(shù)和事件——更合理和更強大慨默。 它由社區(qū)最早提出和實現(xiàn),ES6 將其寫進了語言標準弧腥,統(tǒng)一了用法,原生提供了Promise對象潮太。
所謂Promise管搪,簡單說就是一個容器,里面保存著某個未來才會結(jié)束的事件(通常是一個異步操作)的結(jié)果铡买。 從語法上說更鲁,Promise 是一個對象,從它可以獲取異步操作的消息奇钞。Promise 提供統(tǒng)一的 API澡为,各種異步操 作都可以用同樣的方法進行處理。
2.PROMISE的基本用法
ES6 規(guī)定景埃,Promise對象是一個構(gòu)造函數(shù)媒至,用來生成Promise實例。 下面代碼創(chuàng)造了一個Promise實例谷徙。
var p = new Promise(function (resolve, reject) {
// ... some code
if (/* 異步操作成功 */) {resolve(value);} else {reject(error);}});
Promise構(gòu)造函數(shù)接受一個函數(shù)作為參數(shù)拒啰,該函數(shù)的兩個參數(shù)分別是resolve和reject。 它們是兩個函數(shù)完慧,由 JavaScript 引擎提供谋旦,不用自己部署。
resolve函數(shù)的作用是屈尼,將Promise對象的狀態(tài)從“未完成”變?yōu)椤俺晒Α保磸?Pending 變?yōu)?Resolved)册着,在異步操作成功時調(diào)用,并將異步操作的結(jié)果脾歧,作為參數(shù)傳遞出去甲捏;reject函數(shù)的作用是, 將Promise對象的狀態(tài)從“未完成”變?yōu)椤笆 保磸?Pending 變?yōu)?Rejected)涨椒,在異步操作失敗時調(diào)用摊鸡,并將異步操作報出的錯誤,作為參數(shù)傳遞出去蚕冬。 Promise實例生成以后免猾,可以用then方法分別指定Resolved狀態(tài)和Rejected狀態(tài)的回調(diào)函數(shù)。
p.then(function (value) {// success}, function (error) {// failure});
3.如何使用PROMISE囤热?
function runAsync(){
var p = new Promise(function(resolve, reject){
//做一些異步操作
setTimeout(function(){console.log('執(zhí)行完成');resolve('隨便什么數(shù)據(jù)');}, 2000);});return p;}
runAsync().then(function(data){
console.log(data);//后面可以用傳過來的數(shù)據(jù)做些其他操作//......});
then里面的函數(shù)就跟我們平時的回調(diào)函數(shù)一個意思猎提,能夠在runAsync這個 異步任務(wù)執(zhí)行完成之后被執(zhí)行。這就是Promise的作用了,簡單來講锨苏,就是能把 原來的回調(diào)寫法分離出來疙教,在異步操作執(zhí)行完后,用鏈式調(diào)用的方式執(zhí)行回調(diào)函數(shù)伞租。 寫成回調(diào)函數(shù)如下:function runAsync(callback){
setTimeout(function(){console.log('執(zhí)行完成');callback('隨便什么數(shù)據(jù)');}, 2000);};runAsync(function(data){console.log(data);});
問題:
1贞谓、既然回調(diào)函數(shù)回調(diào)函數(shù)能實現(xiàn)異步操作,為什么還要用Promise呢葵诈?
有多層回調(diào)該怎么辦裸弦?如果callback也是一個異步操作,而且執(zhí)行 完后也需要有相應的回調(diào)函數(shù)作喘,該怎么辦呢理疙?總不能再定義一個callback2,然后給 callback傳進去吧泞坦。而Promise的優(yōu)勢在于窖贤,可以在then方法中繼續(xù)寫Promise對 象并返回,然后繼續(xù)調(diào)用then來進行回調(diào)操作贰锁。
2赃梧、catch方法有什么作用?
在http請求返回一個錯誤的方法李根,如果使用.then方法槽奕,返回的錯誤就不會被捕捉到,.then后面的代碼就會發(fā)生錯誤房轿。catch是捕捉到了錯誤粤攒,并且寫了在返回的錯誤的情況下怎么做。
3.囱持、race()方法第一個請求成功之后夯接,后面的請求會繼續(xù)嗎?
race方法 里面的函數(shù)全部都會執(zhí)行纷妆,只是看哪個先返回盔几,先返回的,.then方法先執(zhí)行掩幢。