国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Promise和Async/Await用法整理

Achilles / 1247人閱讀

摘要:出一個(gè)對(duì)象時(shí),這個(gè)對(duì)象的起始狀態(tài)就是狀態(tài),在根據(jù)或返回狀態(tài)狀態(tài)。而且必須在里面給一個(gè)返回值,才能繼續(xù)調(diào)用,否則。結(jié)果這里寫圖片描述那這個(gè)的返回值是什么呢和上面是一樣的。最終返回的只有一個(gè)值。這就是內(nèi)部的錯(cuò)誤被靜默處理了。

1.Promise
1.簡介
Promise,簡單來說就是一個(gè)容器,里面保存著某個(gè)未來才會(huì)結(jié)束的時(shí)間(通常是一個(gè)異步操作的結(jié)果)
Promise對(duì)象的基本語法:
new Promise((resolve,reject) => {

//.....

});

從語法上來說,Promise是一個(gè)對(duì)象,從它可以獲取異步操作的消息。
基本語法:
let p = new Promise((resolve,reject) => {

//...
resolve("success")

});

p.then(result => {

console.log(result);//success

});

Promise對(duì)象特點(diǎn)和三個(gè)狀態(tài):

這里寫圖片描述

例如:
let p = new Promise((resolve,reject) => {

//...
resolve("success");
console.log("after resolve");
reject("error");

});

p.then(result => {

console.log(result);

});

p.catch(result => {

console.log(result);

})

運(yùn)行結(jié)果:
after resolve
success
resolve下面的語句其實(shí)是可以執(zhí)行的,那么為什么reject的狀態(tài)信息在下面沒有接受到呢?這就是因?yàn)镻romise對(duì)象的特點(diǎn):狀態(tài)的凝固。new出一個(gè)Promise對(duì)象時(shí),這個(gè)對(duì)象的起始狀態(tài)就是Pending狀態(tài),在根據(jù)resolve或reject返回Fulfilled狀態(tài)/Rejected狀態(tài)。
2.

這里寫圖片描述

Then分別接受resolve和reject的信息,有三種參數(shù)形式,第三種比較“怪異”,只用來接收做reject處理。
eg:
let p = new Promise((resolve,reject) => {

//...
let random = Math.random();//小于1大于0
if(random > 0.4) {
    resolve("random > 0.4");
}else {
    reject("random <= 0.4");
}

});

p.then(result => {

console.log("resolve",result);

}, result => {

console.log("reject",result);

});

3.鏈?zhǔn)秸{(diào)用
我們來執(zhí)行一段代碼:
let p = new Promise((resolve,reject) => {

reject("reject");

});

let resultP = p.then(null,result => {

console.log(result);

});

console.log(resultP);

結(jié)果:
Promise { }
reject
js的執(zhí)行順序就是這樣,同步->異步->回調(diào),在同步執(zhí)行的時(shí)候,Promise對(duì)象還處于pending的狀態(tài),也說明了這個(gè)then返回的是一個(gè)Promise對(duì)象。
而且必須在then里面給一個(gè)返回值,才能繼續(xù)調(diào)用,否則undefined。
eg:
let p = new Promise((resolve,reject) => {

reject("error");

});

let resultP = p.then(null,result => {

console.log(result);
return 123;

});

// console.log(resultP);
resultP.then(tmp => {

console.log(tmp);

})

結(jié)果:
error
123
4.catch

這里寫圖片描述

eg:
let p = new Promise((resolve,reject) => {

reject("error");

});

p.catch(result => {

console.log(result);

})

那這個(gè)catch的返回值是什么呢:
和上面then是一樣的。
5.Promise.resolve()

這里寫圖片描述

傳一個(gè)普通的對(duì)象:
// let p1 =Promise.resolve(123);
let p1 =Promise.resolve({name:"xixi",age:"xxxx"});

p1.then(result => {

console.log(result);

});

如果是Promise對(duì)象呢,直接返回
let p = new Promise((resolve,reject) => {

setTimeout(() => {
    resolve("success");
},500);

});

let pp = Promise.resolve(p);

pp.then(result => {

console.log(result);

});

console.log(pp == p);

結(jié)果:
true
success
6.Promise.reject()

這里寫圖片描述

eg:
let p = Promise.reject(123);

console.log(p);

p.then(result => {

console.log(result);

}).catch(result => {

console.log("catch",result);

})

結(jié)果:
Promise { 123 }
catch 123
7.Promise.all()

這里寫圖片描述

eg:
let p1 = Promise.resolve(123);
let p2 = Promise.resolve("hello");
let p3 = Promise.resolve("success");

Promise.all([p1,p2,p3]).then(result => {

console.log(result);

})

結(jié)果:
[ 123, "hello", "success" ]
成功之后就是數(shù)組類型,當(dāng)所有狀態(tài)都是成功狀態(tài)才返回?cái)?shù)組,只要其中有一個(gè)的對(duì)象是reject的,就返回reject的狀態(tài)值。
eg:
let p1 = Promise.resolve(123);
let p2 = Promise.resolve("hello");
let p3 = Promise.resolve("success");
let p4 = Promise.reject("error");

// Promise.all([p1,p2,p3]).then(result => {
// console.log(result);
// });

Promise.all([p1,p2,p4]).then(result => {

console.log(result);

}).catch(result => {

console.log(result);

});

結(jié)果:
error
又一個(gè)eg:
//用sleep來模仿瀏覽器的AJAX請(qǐng)求
function sleep(wait) {

return new Promise((res,rej) => {
    setTimeout(() => {
        res(wait);
    },wait);
});

}

let p1 = sleep(500);
let p2 = sleep(500);
let p3 = sleep(1000);

Promise.all([p1,p2,p3]).then(result => {

console.log(result);
//.....
//loading

});

8.Promise.race

這里寫圖片描述

和all同樣接受多個(gè)對(duì)象,不同的是,race()接受的對(duì)象中,哪個(gè)對(duì)象返回的快就返回哪個(gè)對(duì)象,就如race直譯的賽跑這樣。如果對(duì)象其中有reject狀態(tài)的,必須catch捕捉到,如果返回的夠快,就返回這個(gè)狀態(tài)。race最終返回的只有一個(gè)值。
eg:
//用sleep來模仿瀏覽器的AJAX請(qǐng)求
function sleep(wait) {

return new Promise((res,rej) => {
    setTimeout(() => {
        res(wait);
    },wait);
});

}

let p1 = sleep(500);
let p0 = sleep(2000);

Promise.race([p1,p0]).then(result => {

console.log(result);

});

let p2 = new Promise((resolve,reject) => {

setTimeout(()=>{
    reject("error");
},1000);

});

Promise.race([p0,p2]).then(result => {

console.log(result);

}).catch(result => {

console.log(result);

});

500
error
9.異常處理

這里寫圖片描述

為什么說安靜,一個(gè)例子,Pormise內(nèi)部的錯(cuò)誤外界用try-catch捕捉不到
eg:
try {

let p = new Promise((resolve, reject) => {
    throw new Error("I"m error");
    // reject(new Error("I"m Error"));
});

}catch(e) {

console.log("catch",e);

}

結(jié)果什么都沒打印。
但是拋出的錯(cuò)誤可以通過catch來捕捉:
// try {

let p = new Promise((resolve, reject) => {
    throw new Error("I"m error");
    // reject(new Error("I"m Error"));
});

// }catch(e) {
// console.log("catch",e);
// }

p.catch(result => {

console.log(result);

});

這樣就捕捉到錯(cuò)誤。所以:

這里寫圖片描述

2.Async-Await
1.簡介:

這里寫圖片描述

這里寫圖片描述

async和await在干什么,async用于申明一個(gè)function是異步的,而await可以認(rèn)為是async wait的簡寫,等待一個(gè)異步方法執(zhí)行完成。
2.基本語法

這里寫圖片描述

在Chrome里申明這樣一個(gè)函數(shù),可以在控制臺(tái)看到返回的其實(shí)就是一個(gè)Promise對(duì)象。
擴(kuò)展需要了解的就是Chrome現(xiàn)在也支持asyncFunction,可以在Chrome控制臺(tái)測試:
console.log(async function(){}.constructor);
? AsyncFunction() { [native code] }

3.規(guī)則

這里寫圖片描述

如圖,await放在普通函數(shù)里是會(huì)報(bào)錯(cuò)的。

這里寫圖片描述

eg:
async function demo() {

let result = await Promise.resolve(123);
console.log(result);

}
demo();

4.應(yīng)用
Promise雖然一方面解決了callback的回調(diào)地獄,但是相對(duì)的把回調(diào)“縱向發(fā)展”了,形成了一個(gè)回調(diào)鏈。eg:
function sleep(wait) {

return new Promise((res,rej) => {
    setTimeout(() => {
        res(wait);
    },wait);
});

}

/*
let p1 = sleep(100);
let p2 = sleep(200);
let p =*/

sleep(100).then(result => {

return sleep(result + 100);

}).then(result02 => {

return sleep(result02 + 100);

}).then(result03 => {

console.log(result03);

})

控制臺(tái):
300
后面的結(jié)果都是依賴前面的結(jié)果。
改成async/await寫法就是:
async function demo() {

let result01 = await sleep(100);
//上一個(gè)await執(zhí)行之后才會(huì)執(zhí)行下一句
let result02 = await sleep(result01 + 100);
let result03 = await sleep(result02 + 100);
// console.log(result03);
return result03;

}

demo().then(result => {

console.log(result);

});

因?yàn)閍sync返回的也是promise對(duì)象,所以用then接受就行了。
結(jié)果:
300
需要注意的就是await是強(qiáng)制把異步變成了同步,這一句代碼執(zhí)行完,才會(huì)執(zhí)行下一句。
5.錯(cuò)誤處理

這里寫圖片描述

如果是reject狀態(tài),可以用try-catch捕捉
eg:
let p = new Promise((resolve,reject) => {

setTimeout(() => {
    reject("error");
},1000);

});

async function demo(params) {

try {
    let result = await p;
}catch(e) {
    console.log(e);
}

}

demo();

結(jié)果:
error
這是基本的錯(cuò)誤處理,但是當(dāng)內(nèi)部出現(xiàn)一些錯(cuò)誤時(shí),和上面Promise有點(diǎn)類似,demo()函數(shù)不會(huì)報(bào)錯(cuò),還是需要catch回調(diào)捕捉。這就是內(nèi)部的錯(cuò)誤被“靜默”處理了。
let p = new Promise((resolve,reject) => {

setTimeout(() => {
    reject("error");
},1000);

});

async function demo(params) {

// try {
    let result = name;
// }catch(e) {
//     console.log(e);
// }

}

demo().catch((err) => {

console.log(err);

})

6.注意你的并行執(zhí)行和循環(huán)
比如上面的例子:

這里寫圖片描述

如果這三個(gè)是你想異步發(fā)出的AJAX請(qǐng)求,在這段代碼里其實(shí)是同步的,第一個(gè)發(fā)出去才會(huì)發(fā)第二個(gè),所以async/await需要謹(jǐn)慎使用。

這里寫圖片描述

現(xiàn)在有一些forEach或者map的循環(huán)里,比如在forEach里使用await,這時(shí)候的上下文就變成了array,而不是async function,就會(huì)報(bào)錯(cuò)。這時(shí)候你就要想到是什么錯(cuò)誤。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/106338.html

相關(guān)文章

  • Promise && async/await的理解用法

    摘要:但是中的這種情況與抽象反應(yīng)器模式如何描述完全不同。在處理一個(gè)階段之后并且在移到下一個(gè)隊(duì)列之前,事件循環(huán)將處理兩個(gè)中間隊(duì)列,直到中間隊(duì)列中沒有剩余的項(xiàng)目。如果沒有任務(wù)則循環(huán)退出,每一次隊(duì)列處理都被視為事件循環(huán)的一個(gè)階段。 Promise && async/await的理解和用法 為什么需要promise(承諾)這個(gè)東西 在之前我們處理異步函數(shù)都是用回調(diào)這個(gè)方法,回調(diào)嵌套的時(shí)候會(huì)發(fā)現(xiàn) 閱讀...

    王笑朝 評(píng)論0 收藏0
  • 重學(xué)前端學(xué)習(xí)筆記(十七)--Promise里的代碼為什么比setTimeout先執(zhí)行?

    摘要:版本以及之前,本身還沒有異步執(zhí)行代碼的能力,宿主環(huán)境傳遞給引擎,然后按順序執(zhí)行,由宿主發(fā)起任務(wù)。采納引擎術(shù)語,把宿主發(fā)起的任務(wù)稱為宏觀任務(wù),把引擎發(fā)起的任務(wù)稱為微觀任務(wù)。基本用法示例的回調(diào)是一個(gè)異步的執(zhí)行過程。 筆記說明 重學(xué)前端是程劭非(winter)【前手機(jī)淘寶前端負(fù)責(zé)人】在極客時(shí)間開的一個(gè)專欄,每天10分鐘,重構(gòu)你的前端知識(shí)體系,筆者主要整理學(xué)習(xí)過程的一些要點(diǎn)筆記以及感悟,完整的...

    pinecone 評(píng)論0 收藏0
  • 重學(xué)前端學(xué)習(xí)筆記(十七)--Promise里的代碼為什么比setTimeout先執(zhí)行?

    摘要:版本以及之前,本身還沒有異步執(zhí)行代碼的能力,宿主環(huán)境傳遞給引擎,然后按順序執(zhí)行,由宿主發(fā)起任務(wù)。采納引擎術(shù)語,把宿主發(fā)起的任務(wù)稱為宏觀任務(wù),把引擎發(fā)起的任務(wù)稱為微觀任務(wù)。基本用法示例的回調(diào)是一個(gè)異步的執(zhí)行過程。 筆記說明 重學(xué)前端是程劭非(winter)【前手機(jī)淘寶前端負(fù)責(zé)人】在極客時(shí)間開的一個(gè)專欄,每天10分鐘,重構(gòu)你的前端知識(shí)體系,筆者主要整理學(xué)習(xí)過程的一些要點(diǎn)筆記以及感悟,完整的...

    zorpan 評(píng)論0 收藏0
  • 重學(xué)前端學(xué)習(xí)筆記(十七)--Promise里的代碼為什么比setTimeout先執(zhí)行?

    摘要:版本以及之前,本身還沒有異步執(zhí)行代碼的能力,宿主環(huán)境傳遞給引擎,然后按順序執(zhí)行,由宿主發(fā)起任務(wù)。采納引擎術(shù)語,把宿主發(fā)起的任務(wù)稱為宏觀任務(wù),把引擎發(fā)起的任務(wù)稱為微觀任務(wù)。基本用法示例的回調(diào)是一個(gè)異步的執(zhí)行過程。 筆記說明 重學(xué)前端是程劭非(winter)【前手機(jī)淘寶前端負(fù)責(zé)人】在極客時(shí)間開的一個(gè)專欄,每天10分鐘,重構(gòu)你的前端知識(shí)體系,筆者主要整理學(xué)習(xí)過程的一些要點(diǎn)筆記以及感悟,完整的...

    xiongzenghui 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<