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

資訊專欄INFORMATION COLUMN

es6常用知識(shí)(三) prosime和generator

flybywind / 2502人閱讀

摘要:異步執(zhí)行可以用回調(diào)函數(shù)實(shí)現(xiàn)。全成功也可以通過(guò)解構(gòu)數(shù)組的方式,將展開賦值??梢砸来文玫矫總€(gè)結(jié)果。放棄暫時(shí)放棄執(zhí)行相當(dāng)于創(chuàng)建了一個(gè)對(duì)象。代表是否完成,代表函數(shù)完成,已經(jīng)到終點(diǎn)。是因?yàn)樽罱K的結(jié)果需要在最后的時(shí)候返回最終結(jié)果

prosime

在JavaScript的世界中,所有代碼都是單線程執(zhí)行的。
由于這個(gè)“缺陷”,導(dǎo)致JavaScript的所有網(wǎng)絡(luò)操作,瀏覽器事件,都必須是異步執(zhí)行。異步執(zhí)行可以用回調(diào)函數(shù)實(shí)現(xiàn)。

1 promise 翻譯過(guò)來(lái)是 承諾的意思。
異步:操作之間沒啥關(guān)系。同時(shí)進(jìn)行多個(gè)操作。
同步:同時(shí)只能做一件事情。
異步的缺點(diǎn)就是,代碼復(fù)雜,一層套一層,如果需要執(zhí)行很多個(gè)異步操作都完成在執(zhí)行某個(gè)事情,那么就要嵌套很多層,代碼可讀性差,不好維護(hù)。如:

    // 異步
 ajax("/bannders",function(bannder_data){
     ajax("/hotItems",function(hotItems_data){
         ajax("/slides",function(slides_data){

         },function(){
             alert("讀取失敗")
         })
     },function(){
         alert("讀取失敗")
     })
 },function(){
     alert("讀取失敗")
 })

同步:代碼簡(jiǎn)單 ,寫起來(lái)方便

// 同步
    let bannder_data=ajax_async("/bannders")
    let hotItems_data=ajax_async("/hotItems")
    let slides_data=ajax_async("/slides")

可是同步雖然寫法簡(jiǎn)單,但是每個(gè)步驟需要等待上一個(gè)操作結(jié)束,所以實(shí)際項(xiàng)目中需要的是異步(不等待)的操作。
于是prosime出現(xiàn)了,他的作用就是:

消除異步操作

用同步一樣的方式來(lái)書寫異步代碼

1.Prosime到底怎么用

prosime是es6自帶的。需要的用prosime的時(shí)候,可以直接new出來(lái)一個(gè)peomise對(duì)象。promise里面有一個(gè)參數(shù),這個(gè)參數(shù)是函數(shù),所有的異步操作代碼都寫在這個(gè)函數(shù)里面。這個(gè)函數(shù)有兩個(gè)參數(shù),一個(gè)是resolve(成功),另外一個(gè)是reject(失?。?。例如:

var  p=new Promise(function (resolve,reject) {
   異步代碼
   resolve--成功
   reject---失敗
   $.ajax({
       url:"data/arr.txt",
       dataType:"json",
       success(arr){
           resolve(arr)
       },
       error(err){
           reject(err)
       }
   })
})

promise的使用:p里面的then方法的意思是然后呢?就是當(dāng)peomise對(duì)象執(zhí)行之后有結(jié)果了,
之后執(zhí)行。then里面有兩個(gè)參數(shù),都是函數(shù),第一個(gè)函數(shù)其實(shí)就是resolve對(duì)應(yīng)的結(jié)果。
第二個(gè)函數(shù)就是reject對(duì)象的結(jié)果。

p.then(function(arr){
   console.log("成功了",arr)
},function(err){
   console.log("失敗了",err)
})
2.封裝兩個(gè)promise
var  p1=new Promise(function (resolve,reject) {
   異步代碼
   resolve--成功
   reject---失敗
   $.ajax({
       url:"data/arr.txt",
       dataType:"json",
       success(arr){
           resolve(arr)
       },
       error(err){
           reject(err)
       }
   })
})


var  p2=new Promise(function (resolve,reject) {
   異步代碼
   resolve--成功
   reject---失敗
   $.ajax({
       url:"data/json.txt",
       dataType:"json",
       success(arr){
           resolve(arr)
       },
       error(err){
           reject(err)
       }
   })
})
promie上有一個(gè)方法all,就是全都執(zhí)行完以后,all的參數(shù)是一個(gè)數(shù)組,是所以的promise對(duì)象,
之后then方法里面有兩個(gè)參數(shù),都是函數(shù),第一個(gè)函數(shù)其實(shí)就是全都成功以后,其函數(shù)的參數(shù)就是返回所有resolve結(jié)果。,第二個(gè)函數(shù)是只是有一個(gè)失敗了。:
Promise.all([p1,p2]).then(function(arr){
   alert("全成功")
   console.log(arr)
   也可以通過(guò)解構(gòu)數(shù)組的方式,將arr展開賦值。可以依次拿到 每個(gè)resolve結(jié)果。
   let  [p1,p2]=arr
   console.log(p1)
   console.log(p2)
},function(){
   alert("至少有一個(gè)失敗")
})


Promise的二次封裝,createPromise,抽出可變的URL即可。

function createPromise(url) {
    return new Promise(function (resolve, reject) {
        // 異步代碼
        // resolve--成功
        // reject---失敗
        $.ajax({   
            url,//    url:url      json 值和名相同可簡(jiǎn)寫,
            dataType: "json",
            success(arr) {
                resolve(arr)
            },
            error(err) {
                reject(err)
            }
        })
    })
}


// promie上有一個(gè)方法all,就是全都執(zhí)行完以后,all的參數(shù)是一個(gè)數(shù)組,是所以的promise對(duì)象,
// 之后then方法里面有兩個(gè)參數(shù),都是函數(shù),第一個(gè)函數(shù)其實(shí)就是全都成功以后,其函數(shù)的參數(shù)就是返回所有resolve結(jié)果。,第二個(gè)函數(shù)是只是有一個(gè)失敗了。:
Promise.all([createPromise("data/arr.txt"), createPromise("data/json.txt")]).then(function (arr) {
    alert("全成功")
    console.log(arr)
    //    也可以通過(guò)解構(gòu)數(shù)組的方式,將arr展開賦值??梢砸来文玫?每個(gè)resolve結(jié)果。
    let [p1, p2] = arr
    console.log(p1)
    console.log(p2)
}, function () {
    alert("至少有一個(gè)失敗!")
})



generator (生成器) 1.什么是generaor函數(shù)。

Generator函數(shù)是一個(gè)帶星星函數(shù)(星號(hào)和function和函數(shù)名不能同時(shí)連接接口),而且是一個(gè)可以暫停的函數(shù)。
函數(shù)的內(nèi)部通過(guò)yield來(lái)推進(jìn)函數(shù)。通過(guò)定義yield后面的值來(lái)決定返回的value。
函數(shù)返回一個(gè)遍歷器,這個(gè)遍歷器有一個(gè)next方法,可以獲取一個(gè)對(duì)象,這個(gè)對(duì)象就包含了yield定義好的參數(shù)。

    function *show(){
        alert("a")
        yield; //放棄(暫時(shí)放棄執(zhí)行)
        alert("b")
    }
    let genObj=show() //相當(dāng)于創(chuàng)建了一個(gè)generator對(duì)象。
    //這個(gè)對(duì)象里有一個(gè)很重要的東西next(),就是下一步,下一步。
    //就是踹一腳走一步。
    genObj.next() //執(zhí)行一步之后,看到y(tǒng)ield之后,就停止執(zhí)行了。
    //如果想讓alert(’b‘)出來(lái)就需要next兩步。
    genObj.next()

普通函數(shù) ----一路到底
generator函數(shù)---中間能停

2.yield的傳參

2.1第一個(gè)next是廢的,不能傳參。

// yield可以傳參
function *show(){
    alert("a");

    let a=yield;
    alert("b");
    alert(a);
}
let gen=show();
gen.next(12);  //通過(guò)yield傳參的時(shí)候,第一個(gè)next是廢的,傳傳不了,如果想給第一個(gè)yield傳參,
//通過(guò)函數(shù)就可以傳參
gen.next(5);

2.2給第一個(gè)yield傳參,就直接通過(guò)函數(shù)傳參就可以了

    // 給第一個(gè)yield傳參,就直接通過(guò)函數(shù)傳參就可以了。
    function *show(num1,num2){
        alert(`${num1},${num2}`)
        alert("a");
        
        let a=yield;
        alert("b");
        alert(a);
    }
    let gen=show(98,97);
    gen.next(12);  //通過(guò)yield傳參的時(shí)候,第一個(gè)next是廢的,傳傳不了,如果想給第一個(gè)yield傳參,
    //通過(guò)函數(shù)就可以傳參
    gen.next(5);

3 yield的返回值。

3.1 done代表是否完成

    function * show (){
        alert("a")
        yield 12;
        alert("b")
    }
    let gen =show()
    let res1=gen.next()
    console.log(res1)// {done:false, value:12} //done 代表是否完成,代表函數(shù)沒完成,沒到終點(diǎn)。
    let res2=gen.next()
    console.log(res2) // {done:true, value:undefind} //done 代表是否完成,true代表函數(shù)完成,已經(jīng)到終點(diǎn)。undefind是因?yàn)樽罱K的結(jié)果需要在
    // generator最后的時(shí)候return 返回最終結(jié)果

3.2 generator最后的return是返回最終結(jié)果

    function * show (){
        alert("a")
        yield 12; //yield返回
        alert("b")
        return 100
    }
    let gen =show()
    let res1=gen.next()
    console.log(res1)// {done:false, value:12} //done 代表是否完成,代表函數(shù)沒完成,沒到終點(diǎn)。
    let res2=gen.next()
    console.log(res2) // {done:true, value:100} //done 代表是否完成,true代表函數(shù)完成,已經(jīng)到終點(diǎn)。undefind是因?yàn)樽罱K的結(jié)果需要在
    // generator最后的時(shí)候return 返回最終結(jié)果

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

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

相關(guān)文章

  • ES6-7

    摘要:的翻譯文檔由的維護(hù)很多人說(shuō),阮老師已經(jīng)有一本關(guān)于的書了入門,覺得看看這本書就足夠了。前端的異步解決方案之和異步編程模式在前端開發(fā)過(guò)程中,顯得越來(lái)越重要。為了讓編程更美好,我們就需要引入來(lái)降低異步編程的復(fù)雜性。 JavaScript Promise 迷你書(中文版) 超詳細(xì)介紹promise的gitbook,看完再不會(huì)promise...... 本書的目的是以目前還在制定中的ECMASc...

    mudiyouyou 評(píng)論0 收藏0
  • ES6常用知識(shí)點(diǎn)概述

    摘要:那之前的例子來(lái)使用一下的話,你會(huì)發(fā)現(xiàn)瀏覽器報(bào)錯(cuò)了,如圖定義的變量不允許二次修改。如圖箭頭函數(shù)沒有它自己的值,箭頭函數(shù)內(nèi)的值繼承自外圍作用域。如圖這里兩邊的結(jié)構(gòu)沒有一致,如果是的話,是可以正常解構(gòu)的。 前言 國(guó)慶假期已過(guò)一半,來(lái)篇干貨壓壓驚。 ES6,并不是一個(gè)新鮮的東西,ES7、ES8已經(jīng)趕腳了。但是,東西不在于新,而在于總結(jié)。每個(gè)學(xué)前端的人,身邊也必定有本阮老師的《ES6標(biāo)準(zhǔn)入門》或...

    keithyau 評(píng)論0 收藏0
  • 從0到1使用VUE-CLI3開發(fā)實(shí)戰(zhàn)(): ES6/ES7知識(shí)儲(chǔ)備

    摘要:它們都用于聲明變量。盲目使用替換后可能會(huì)導(dǎo)致預(yù)期意外的結(jié)果。有鑒于此,還是建議使用字符串,布爾和數(shù)字類型的數(shù)據(jù)類型。像使用這種下劃線命名約定在一個(gè)開源項(xiàng)目中,命名規(guī)則很難維持得一直很好,這樣經(jīng)常會(huì)造成一些困擾。 今天群里有小伙伴跟我聊天,問(wèn)了我?guī)讉€(gè)關(guān)于ES6的問(wèn)題,我才意識(shí)到,大部分初學(xué)者在學(xué)習(xí)的過(guò)程中,都是學(xué)了HTML/CSS/JS之后就開始上手學(xué)習(xí)框架了,而對(duì)于ES6的重視程度卻不...

    crossoverJie 評(píng)論0 收藏0
  • ES6 常用知識(shí)點(diǎn)總結(jié)

    摘要:常用知識(shí)總結(jié)之前總結(jié)了中的一些知識(shí)點(diǎn)。在年正式發(fā)布了,簡(jiǎn)稱,又稱為。作為構(gòu)造函數(shù)的語(yǔ)法糖,同時(shí)有屬性和屬性,因此同時(shí)存在兩條繼承鏈。子類的屬性,表示構(gòu)造函數(shù)的繼承,總是指向父類。 ES6常用知識(shí)總結(jié) 之前總結(jié)了es5中js的一些知識(shí)點(diǎn)。這段時(shí)間看了石川blue老師講解的es6課程,結(jié)合阮一峰老師的es6教程,隨手做了一些筆記和總結(jié)分享給大家。內(nèi)容還是es6主要的知識(shí)點(diǎn),基本沒有什么創(chuàng)新...

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

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

0條評(píng)論

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