成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

「 JS 」快速上手異步方案

pinecone / 3386人閱讀

摘要:構(gòu)造函數(shù)回調(diào)函數(shù)是同步的回調(diào)異步操作的實(shí)例對(duì)象有三個(gè)狀態(tài)初始狀態(tài),既不是成功,也不是失敗狀態(tài)。如果中的回調(diào)函數(shù)拋出一個(gè)錯(cuò)誤,那么返回的將會(huì)成為拒絕狀態(tài),并且將拋出的錯(cuò)誤作為拒絕狀態(tài)的回調(diào)函數(shù)的參數(shù)值。

問題:解決異步回調(diào)的深層嵌套的問題.(回調(diào)地獄)
1. Promise

promise對(duì)象用于表示一個(gè)異步操作的最終狀態(tài),promise在回調(diào)代碼和將要執(zhí)行這個(gè)任務(wù)的異步代碼之間提供了一種可靠的中間機(jī)制來管理回調(diào)。

//構(gòu)造函數(shù),回調(diào)函數(shù)是同步的回調(diào)
new Promise(function(resolve,reject){
    ....//異步操作
})

Promise的實(shí)例對(duì)象有三個(gè)狀態(tài)

?pending: 初始狀態(tài),既不是成功,也不是失敗狀態(tài)。

fulfilled: 意味著操作成功完成。

rejected: 意味著操作失敗

resolve和reject分別是兩個(gè)函數(shù),當(dāng)在回調(diào)中調(diào)用時(shí),會(huì)改變promise實(shí)例的狀態(tài),resolve改變狀態(tài)為成功,reject為失敗.

then

Promise.prototype.then()

當(dāng)promise對(duì)象的狀態(tài)發(fā)生改變時(shí),綁定在其身上的then方法就會(huì)被調(diào)用。
then方法包含兩個(gè)參數(shù):onfulfilled函數(shù) 和 onrejected函數(shù),它們都是 Function
類型。當(dāng)Promise狀態(tài)為fulfilled時(shí),調(diào)用 then 的 onfulfilled 方法,當(dāng)Promise狀態(tài)為rejected時(shí),調(diào)用 then 的 onrejected 方法, 所以在異步操作的完成和綁定處理方法之間不存在競(jìng)爭(zhēng),then() 方法返回一個(gè)?Promise對(duì)象.

返回值

then方法返回一個(gè)新的Promise,而它的行為與then中的回調(diào)函數(shù)的返回值有關(guān):

如果then中的回調(diào)函數(shù)返回一個(gè)值,那么then返回的Promise將會(huì)成為接受狀態(tài),并且將返回的值作為接受狀態(tài)的回調(diào)函數(shù)的參數(shù)值。

如果then中的回調(diào)函數(shù)拋出一個(gè)錯(cuò)誤,那么then返回的Promise將會(huì)成為拒絕狀態(tài),并且將拋出的錯(cuò)誤作為拒絕狀態(tài)的回調(diào)函數(shù)的參數(shù)值。

如果then中的回調(diào)函數(shù)返回一個(gè)已經(jīng)是接受狀態(tài)的Promise,那么then返回的Promise也會(huì)成為接受狀態(tài),并且將那個(gè)Promise的接受狀態(tài)的回調(diào)函數(shù)的參數(shù)值作為該被返回的Promise的接受狀態(tài)回調(diào)函數(shù)的參數(shù)值。

如果then中的回調(diào)函數(shù)返回一個(gè)已經(jīng)是拒絕狀態(tài)的Promise,那么then返回的Promise也會(huì)成為拒絕狀態(tài),并且將那個(gè)Promise的拒絕狀態(tài)的回調(diào)函數(shù)的參數(shù)值作為該被返回的Promise的拒絕狀態(tài)回調(diào)函數(shù)的參數(shù)值。

如果then中的回調(diào)函數(shù)返回一個(gè)未定狀態(tài)(pending)的Promise,那么then返回Promise的狀態(tài)也是未定的,并且它的終態(tài)與那個(gè)Promise的終態(tài)相同;同時(shí),它變?yōu)榻K態(tài)時(shí)調(diào)用的回調(diào)函數(shù)參數(shù)與那個(gè)Promise變?yōu)榻K態(tài)時(shí)的回調(diào)函數(shù)的參數(shù)是相同的。

catch

catch()?方法返回一個(gè)Promise,并且處理拒絕的情況。

Promise.prototype.catch()

事實(shí)上,catch方法相當(dāng)于then方法的第二個(gè)參數(shù)方法,觸發(fā)拒絕狀態(tài).

注意,
如果調(diào)用?then的?Promise?的狀態(tài)(fulfillment 或 rejection)發(fā)生改變,但是?then?中并沒有關(guān)于這種狀態(tài)的回調(diào)函數(shù),那么?then?將創(chuàng)建一個(gè)沒有經(jīng)過回調(diào)函數(shù)處理的新?Promise?對(duì)象,這個(gè)新?Promise?只是簡(jiǎn)單地接受調(diào)用這個(gè)?then?的原?Promise?的終態(tài)作為它的終態(tài)。所以在鏈?zhǔn)缴?最終會(huì)執(zhí)行到catch上.

//鏈?zhǔn)绞纠?new Promise(function (resolve, reject) {
setTimeout(function () {
console.log("1");
resolve();
}, 1000);
}).then(function () {
return new Promise(function (resolve, reject) {
setTimeout(function () {
console.log("2");
// resolve();
reject();
}, 1000);
});
}).then(function () {
return new Promise(function (resolve, reject) {
setTimeout(function () {
console.log("3");
resolve();
}, 1000);
});
}).then(function () {
return new Promise(function (resolve, reject) {
setTimeout(function () {
console.log("4");
resolve();
}, 1000);
});
}).catch(function(){
console.log("catch");
})
2. genarator

symbol

新的一種基礎(chǔ)數(shù)據(jù)類型symbol,表示獨(dú)一無二的值.
它通常作為對(duì)象的屬性鍵,內(nèi)置對(duì)象普遍存在該值.

// 一般用法,它并不是構(gòu)造器,不能通過new,會(huì)報(bào)錯(cuò).
let sym = Symbol();

// 在對(duì)象中表現(xiàn)形式,要用[]包裹,不然會(huì)被認(rèn)為是string.
var obj = {
    [Symbol()]:"value";
}

該屬性是匿名,所以不可枚舉,只能通過.getOwnPropertySymbols()返回的數(shù)組.

// 想要獲得兩個(gè)相同的Symbol,得通過.for()

Symbol("asd") === Symbol("asd") // false
Symbol.for("asd") === Symbol.for("asd")  // true

Iterator

迭代器,存在于特定幾種可枚舉的數(shù)據(jù)類型中.

// 一般用以下這種形式的鍵保存了迭代器函數(shù).
// arr[Symbol.iterator]

aarr[Symbol.iterator]( ).next( )  //遍歷下一個(gè),返回value和done,value表示值,done表示是否可以繼續(xù)遍歷下一個(gè).

//for...of循環(huán)遍歷就是基于此,必須該數(shù)據(jù)類型有迭代器.

回到generator

//表現(xiàn)形式
function* test(){
   
   yield 1; //任務(wù)1
   
   yield 2; //任務(wù)2
  
   yield 3;  //任務(wù)3
  
   yield 4 ; //任務(wù)4
}
//  調(diào)用該方法會(huì)返回一個(gè)含有迭代對(duì)象的對(duì)象.
var obj = text();
obj.next();   //調(diào)用該方法時(shí),每次到一個(gè)yield處停止.
3. async/await

作用:

簡(jiǎn)化promise的使用編碼, 不通過then()/catch()來指定回調(diào)函數(shù)

以同步編碼方式實(shí)現(xiàn)異步流程

async function test (){

    //  等待狀態(tài)改變,自動(dòng)執(zhí)行到下一個(gè)wait處
 var flag =  await  new Promise((resolve,reject)=>{
    
            setTimeout(function(){
            
            // 狀態(tài)改變
            resolve(data); //這里面的值傳遞給flag
            },1000)
   })
   //通過flag傳遞數(shù)據(jù)
 flag =  await  new Promise((resolve,reject)=>{
    
            setTimeout(function(flag){
            
            // 狀態(tài)改變
            resolve(flag);
            },1000,flag)
   })
}

test().catch(function(err){
        //處理異常
});

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/103667.html

相關(guān)文章

  • 珠峰前端架構(gòu)師培養(yǎng)計(jì)劃

    摘要:公司的招聘要求都提到了至少熟悉其中一種前端框架,有前端工程化與模塊化開發(fā)實(shí)踐經(jīng)驗(yàn)相關(guān)字眼。我們主要從端公眾號(hào)移動(dòng)端小程序三大平臺(tái)進(jìn)行前端的技術(shù)選型,并來說說選其技術(shù)的幾大優(yōu)勢(shì)。技術(shù)的優(yōu)勢(shì)互聯(lián)網(wǎng)前端大潮后,前端出現(xiàn)了大框架,分別是與。 1、技術(shù)選型的背景前端技術(shù)發(fā)展日新月異,互聯(lián)網(wǎng)上出現(xiàn)的新型框架也比較多,如何讓新招聘的人員...

    ccj659 評(píng)論0 收藏0
  • H5學(xué)習(xí)

    摘要:為此決定自研一個(gè)富文本編輯器。本文,主要介紹如何實(shí)現(xiàn)富文本編輯器,和解決一些不同瀏覽器和設(shè)備之間的。 對(duì)ES6Generator函數(shù)的理解 Generator 函數(shù)是 ES6 提供的一種異步編程解決方案,語法行為與傳統(tǒng)函數(shù)完全不同。 JavaScript 設(shè)計(jì)模式 ② 巧用工廠模式和創(chuàng)建者模式 我為什么把他們兩個(gè)放在一起講?我覺得這兩個(gè)設(shè)計(jì)模式有相似之處,有時(shí)候會(huì)一個(gè)設(shè)計(jì)模式不能滿...

    aristark 評(píng)論0 收藏0
  • Swoole難上手?從EasySwoole開始

    摘要:組件提供了很多實(shí)用的組件包括控制臺(tái)組件定時(shí)器觸發(fā)器日志處理等等致謝從下一章開始,我們逐步使用的各項(xiàng)功能并開發(fā)一個(gè)簡(jiǎn)單的并發(fā)版爬蟲系統(tǒng),感謝你看到這里,希望本文可以幫到你,謝謝 showImg(https://segmentfault.com/img/bVbpts4?w=640&h=160); 前言 我一生的文章都會(huì)放在這里,我的博客,我希望每一行代碼,每一段文字都能幫助你。https:...

    lavor 評(píng)論0 收藏0
  • Pastate.js : 響應(yīng)式 react state 管理框架

    摘要:簡(jiǎn)介是什么是一個(gè)響應(yīng)式管理框架,實(shí)現(xiàn)了對(duì)的異步響應(yīng)式管理。可靠性已經(jīng)通過個(gè)測(cè)試用例的全面測(cè)試,穩(wěn)定可靠。安裝是一個(gè)狀態(tài)管理框架,需要配合使用。 Pastate 簡(jiǎn)介 Pastate 是什么 Pastate 是一個(gè)響應(yīng)式 react state 管理框架,實(shí)現(xiàn)了對(duì) state 的異步響應(yīng)式管理。Pastate 是一個(gè)精益框架,它對(duì)很多高級(jí)概念進(jìn)行了友好封裝,這意味著你不必學(xué)習(xí)一些難以理解...

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

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

0條評(píng)論

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