摘要:所以,函數(shù)的一個(gè)重要實(shí)際意義就是用來處理異步操作,改寫回調(diào)函數(shù)。表示在這里等待異步操作返回結(jié)果,再繼續(xù)執(zhí)行。
JS異步之Promise,Generator,Async Promise
解決的問題:回調(diào)地獄
Promise規(guī)范:
promise有三種狀態(tài),等待(pending)、已完成(fulfilled/resolved)、已拒絕(rejected).Promise的狀態(tài)只能從“等待”轉(zhuǎn)到“完成”或者“拒絕”,不能逆向轉(zhuǎn)換,同時(shí)“完成”和“拒絕”也不能相互轉(zhuǎn)換.
promise 必須提供一個(gè) then方法以訪問其當(dāng)前值、終值和據(jù)因。promise.then(resolve, reject),resolve 和 reject都是可選參數(shù)。如果 resolve 或reject 不是函數(shù),其必須被忽略.
then 方法必須返回一個(gè) promise 對象.
使用:
實(shí)例化promise對象需要傳入函數(shù)(包含兩個(gè)參數(shù)),resolve和reject,內(nèi)部確定狀態(tài).resolve和reject函數(shù)可以傳入?yún)?shù)在回調(diào)函數(shù)中使用.
resolve和reject都是函數(shù),傳入的參數(shù)在then的回調(diào)函數(shù)中接收.
var promise = new Promise(function(resolve, reject) { setTimeout(function(){ resolve("好哈哈哈哈"); }); }); promise.then(function(val){ console.log(val) })
then接收兩個(gè)函數(shù),分別對應(yīng)resolve和reject狀態(tài)的回調(diào),函數(shù)中接收實(shí)例化時(shí)傳入的參數(shù).
promise.then(val=>{ //resolved },reason=>{ //rejected })
catch相當(dāng)于.then(null, rejection)
當(dāng)then中沒有傳入rejection時(shí),錯(cuò)誤會(huì)冒泡進(jìn)入catch函數(shù)中,若傳入了rejection,則錯(cuò)誤會(huì)被rejection捕獲,而且不會(huì)進(jìn)入catch.此外,then中的回調(diào)函數(shù)中發(fā)生的錯(cuò)誤只會(huì)在下一級(jí)的then中被捕獲,不會(huì)影響該promise的狀態(tài).
new Promise((resolve,reject)=>{ throw new Error("錯(cuò)誤") }).then(null,(err)=>{ console.log(err,1);//此處捕獲 }).catch((err)=>{ console.log(err,2); }); // 對比 new Promise((resolve,reject)=>{ throw new Error("錯(cuò)誤") }).then(null,null).catch((err)=>{ console.log(err,2);//此處捕獲 }); // 錯(cuò)誤示例 new Promise((resolve,reject)=>{ resolve("正常"); }).then((val)=>{ throw new Error("回調(diào)函數(shù)中錯(cuò)誤") },(err)=>{ console.log(err,1); }).then(null,(err)=>{ console.log(err,2);//此處捕獲,也可用catch });
兩者不等價(jià)的情況:
此時(shí),catch捕獲的并不是p1的錯(cuò)誤,而是p2的錯(cuò)誤,
p1().then(res=>{ return p2()//p2返回一個(gè)promise對象 }).catch(err=> console.log(err))
一個(gè)錯(cuò)誤捕獲的錯(cuò)誤用例:
該函數(shù)調(diào)用中即使發(fā)生了錯(cuò)誤依然會(huì)進(jìn)入then中的resolve的回調(diào)函數(shù),因?yàn)楹瘮?shù)p1中實(shí)例化promise對象時(shí)已經(jīng)調(diào)用了catch,若發(fā)生錯(cuò)誤會(huì)進(jìn)入catch中,此時(shí)會(huì)返回一個(gè)新的promise,因此即使發(fā)生錯(cuò)誤依然會(huì)進(jìn)入p1函數(shù)的then鏈中的resolve回調(diào)函數(shù).
function p1(val){ return new Promise((resolve,reject)=>{ if(val){ var len = val.length;//傳入null會(huì)發(fā)生錯(cuò)誤,進(jìn)入catch捕獲錯(cuò)誤 resolve(len); }else{ reject(); } }).catch((err)=>{ console.log(err) }) }; p1(null).then((len)=>{ console.log(len,"resolved"); },()=>{ console.log("rejected"); }).catch((err)=>{ console.log(err,"catch"); })
Promise回調(diào)鏈:
promise能夠在回調(diào)函數(shù)里面使用 return 和 throw, 所以在then中可以return出一個(gè)promise對象或其他值,也可以throw出一個(gè)錯(cuò)誤對象,但如果沒有return,將默認(rèn)返回 undefined,那么后面的then中的回調(diào)參數(shù)接收到的將是undefined.
function p1(val){ return new Promise((resolve,reject)=>{ val==1?resolve(1):reject() }) }; function p2(val){ return new Promise((resolve,reject)=>{ val==2?resolve(2):reject(); }) }; let promimse = new Promise(function(resolve,reject){ resolve(1) }) .then(function(data1) { return p1(data1)//如果去掉return,則返回undefined而不是p1的返回值,會(huì)導(dǎo)致報(bào)錯(cuò) }) .then(function(data2){ return p2(data2+1) }) .then(res=>console.log(res))Generator函數(shù):
generator函數(shù)使用:
1、分段執(zhí)行,可以暫停
2、可以控制階段和每個(gè)階段的返回值
3、可以知道是否執(zhí)行到結(jié)尾
function* g() { var o = 1; yield o++; yield o++; } var gen = g(); console.log(gen.next()); // Object {value: 1, done: false} var xxx = g(); console.log(gen.next()); // Object {value: 2, done: false} console.log(xxx.next()); // Object {value: 1, done: false} console.log(gen.next()); // Object {value: undefined, done: true}
generator和異步控制:
利用Generator函數(shù)的暫停執(zhí)行的效果,可以把異步操作寫在yield語句里面,等到調(diào)用next方法時(shí)再往后執(zhí)行。這實(shí)際上等同于不需要寫回調(diào)函數(shù)了,因?yàn)楫惒讲僮鞯暮罄m(xù)操作可以放在yield語句下面,反正要等到調(diào)用next方法時(shí)再執(zhí)行。所以,Generator函數(shù)的一個(gè)重要實(shí)際意義就是用來處理異步操作,改寫回調(diào)函數(shù)。
用法:
async 表示這是一個(gè)async函數(shù),await只能用在這個(gè)函數(shù)里面。
await 表示在這里等待異步操作返回結(jié)果,再繼續(xù)執(zhí)行。
await 后一般是一個(gè)promise對象
示例:async用于定義一個(gè)異步函數(shù),該函數(shù)返回一個(gè)Promise。
如果async函數(shù)返回的是一個(gè)同步的值,這個(gè)值將被包裝成一個(gè)理解resolve的Promise,等同于return Promise.resolve(value)。
await用于一個(gè)異步操作之前,表示要“等待”這個(gè)異步操作的返回值。await也可以用于一個(gè)同步的值。
let timer = async function timer(){ return new Promise((resolve,reject) => { setTimeout(() => { resolve("500"); },500); }); } timer().then(result => { console.log(result); //500 }).catch(err => { console.log(err.message); }); //返回一個(gè)同步的值 let sayHi = async function sayHi(){ let hi = await "hello world"; return hi; //等同于return Promise.resolve(hi); } sayHi().then(result => { console.log(result); });
參考:
Promise迷你書
promise筆記
手寫promise
promise實(shí)現(xiàn)
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/85043.html
摘要:所以,函數(shù)的一個(gè)重要實(shí)際意義就是用來處理異步操作,改寫回調(diào)函數(shù)。表示在這里等待異步操作返回結(jié)果,再繼續(xù)執(zhí)行。 JS異步之Promise,Generator,Async Promise 解決的問題:回調(diào)地獄 Promise規(guī)范: promise有三種狀態(tài),等待(pending)、已完成(fulfilled/resolved)、已拒絕(rejected).Promise的狀態(tài)只能從...
摘要:所以,函數(shù)的一個(gè)重要實(shí)際意義就是用來處理異步操作,改寫回調(diào)函數(shù)。表示在這里等待異步操作返回結(jié)果,再繼續(xù)執(zhí)行。 JS異步之Promise,Generator,Async Promise 解決的問題:回調(diào)地獄 Promise規(guī)范: promise有三種狀態(tài),等待(pending)、已完成(fulfilled/resolved)、已拒絕(rejected).Promise的狀態(tài)只能從...
摘要:如果你還沒讀過上篇上篇和中篇并無依賴關(guān)系,您可以讀過本文之后再閱讀上篇,可戳面試篇寒冬求職季之你必須要懂的原生上小姐姐花了近百個(gè)小時(shí)才完成這篇文章,篇幅較長,希望大家閱讀時(shí)多花點(diǎn)耐心,力求真正的掌握相關(guān)知識(shí)點(diǎn)。 互聯(lián)網(wǎng)寒冬之際,各大公司都縮減了HC,甚至是采取了裁員措施,在這樣的大環(huán)境之下,想要獲得一份更好的工作,必然需要付出更多的努力。 一年前,也許你搞清楚閉包,this,原型鏈,就能獲得...
摘要:拋出的錯(cuò)誤對象會(huì)被方法回調(diào)函數(shù)接收到命令命令后面是一個(gè)對象,返回該對象的結(jié)果。有人將其稱之為宏任務(wù)微任務(wù),定時(shí)器就屬于宏任務(wù)的范疇。 前言 上一篇 前端面試題-JavaScript(一), 感興趣的小伙伴也可以移步這里查看 完整版JavaScript面試題,面試題會(huì)不定期更新加進(jìn)去一些個(gè)人工作中遇到的或者認(rèn)為比較重要的東西,后面會(huì)涉及到前端的各個(gè)方面,感興趣的小伙伴可以關(guān)注哦! 如果文...
閱讀 2621·2021-11-16 11:40
閱讀 3417·2021-11-08 13:26
閱讀 886·2021-10-28 09:32
閱讀 3542·2021-09-13 10:26
閱讀 815·2019-08-30 15:55
閱讀 788·2019-08-30 15:44
閱讀 1917·2019-08-30 15:44
閱讀 1762·2019-08-30 13:48