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

資訊專(zhuān)欄INFORMATION COLUMN

Promise

laoLiueizo / 823人閱讀

摘要:上面的代碼指定了兩個(gè)回調(diào)函數(shù),第一個(gè)回調(diào)函數(shù)完成以后,會(huì)將結(jié)果作為參數(shù)傳入到第二個(gè)回調(diào)函數(shù)。對(duì)進(jìn)行處理捕捉錯(cuò)誤方法其實(shí)是對(duì)的調(diào)用,用于指定發(fā)生錯(cuò)誤時(shí)的回調(diào)函數(shù)。

Promise對(duì)象是一種異步編程的解決方案,比傳統(tǒng)的解決方案——會(huì)掉函數(shù)和事件——更合理和強(qiáng)大。
Promise有三種狀態(tài):pending(進(jìn)行中)、Resolved(Fulfilled,已完成)和Rejected(已失敗);而且狀態(tài)一旦改變,就不會(huì)再發(fā)生改變,Promise對(duì)象的狀態(tài)只有兩種可能:從Pending變?yōu)镽esolved和從Pending變?yōu)镽ejected。只要這兩種情況發(fā)生了,狀態(tài)就凝固了,不會(huì)再變了。Promise有一些缺點(diǎn),就是無(wú)法取消,一旦新建它就會(huì)執(zhí)行,無(wú)法中途取消;其次如果不設(shè)置回調(diào)函數(shù),Promise內(nèi)部拋出的錯(cuò)誤,不會(huì)反應(yīng)到外部;第三Pending狀態(tài)時(shí),無(wú)法得知目前進(jìn)展到哪一個(gè)階段。

基本用法

Promise構(gòu)造函數(shù)接受一個(gè)函數(shù)作為參數(shù),該函數(shù)參數(shù)分別是resolve和reject方法。如果成功,則用resolve將Promise的狀態(tài)改為成功,即從Pending變?yōu)閞esolved;如果異步失敗,則從Pending改為rejected。

基本用法

var promise = new Promise(function(resolve, reject){
    if(/*異步操作成功*/){
        resolve(value);
    } else{
        reject(error);
    }
});
promise.then(function(value){
    //success
}, function(value){
    //failure
});

一個(gè)簡(jiǎn)單實(shí)用的例子

function timeout(ms){
    return new Promise((resolve) => {
        setTimeout(resolve, ms);
    });
}

timeout(100).then(()=>{
    console.log("done");
})

如果用Promise對(duì)象實(shí)現(xiàn)Ajax操作

var getJSON = function(url){
    var promise = new Promise(function(resolve, reject){
        var client = new XMLHttpRequest();
        client.open("GET", url);
        client.onreadystatechange = handler;
        client.responseType = "json";
        client.setRequestHeader("Accept", "application/json");
        client.send();
        
        function handler(){
            if(this.status == 200){
                resolve(this.response);
            }else {
                reject(new Error(this.statusText));
            }
        }
        
        return promise;
    })
}

getJSON("/posts.json").then(function(json){
    console.log("Contents:" + json);
}, function(error){
    console.error("出錯(cuò)了", error);
})

在resolve的方法參數(shù)除了正常值以為,還可以能是另一個(gè)Promise實(shí)例。

Promise的鏈?zhǔn)讲僮鳎篜romise.prototype.then

Promise.prototype.then返回的是一個(gè)新的Promise對(duì)象,因此可以寫(xiě)成鏈?zhǔn)降摹?/p>

getJSON("/posts.json").then(function(json){
    return json.post;
}).then(function(){
    //proceed
})

上面的代碼指定了兩個(gè)回調(diào)函數(shù),第一個(gè)回調(diào)函數(shù)完成以后,會(huì)將結(jié)果作為參數(shù)傳入到第二個(gè)回調(diào)函數(shù)。
如果第一個(gè)回調(diào)函數(shù)返回的是Promise對(duì)象,這樣后一個(gè)函數(shù)調(diào)用就將等待該P(yáng)romise對(duì)象有了運(yùn)行結(jié)果,才會(huì)進(jìn)一步調(diào)用。

getJSON("/post/1.json").then(function(post){
    return getJSON(post.commentURL);
}).then(function(comments){
    //對(duì)comments進(jìn)行處理
})
捕捉錯(cuò)誤:Promise.prototype.catch方法
Promise.prototype.catch其實(shí)是對(duì)Promise.prototype.then(null, rejection)的調(diào)用,用于指定發(fā)生錯(cuò)誤時(shí)的回調(diào)函數(shù)。

Promise.prototype.catch 對(duì)錯(cuò)誤具有“冒泡”性質(zhì),會(huì)一直向后傳遞,直到被捕獲,也就是錯(cuò)我總是被下一個(gè)catch語(yǔ)句捕獲。

getJSON("/post/1.json").then(function(post) {
  return getJSON(post.commentURL);
}).then(function(comments) {
  // some code
}).catch(function(error) {
  // 處理前兩個(gè)回調(diào)函數(shù)的錯(cuò)誤
});
Promise.all方法

var p = Promise.all([p1,p2,p3]);

這個(gè)方法接受一個(gè)數(shù)組作為參數(shù),p1,p2,p3都是Promise對(duì)象的實(shí)例。p的最終狀態(tài)取決于參數(shù)對(duì)象數(shù)組的狀態(tài),上例中就是p1,p2,p3來(lái)決定的。如果這三個(gè)都是fulfilled,那么p的狀態(tài)就是fulfilled;如果p1,p2,p3中有一個(gè)是rejected,p的狀態(tài)就是rejected.那么p的狀態(tài)就是reject,會(huì)傳遞給p的回調(diào)函數(shù)。

// 生成一個(gè)Promise對(duì)象的數(shù)組
var promises = [2, 3, 5, 7, 11, 13].map(function(id){
  return getJSON("/post/" + id + ".json");
});

Promise.all(promises).then(function(posts) {
  // ...  
}).catch(function(reason){
  // ...
});
Promise.resolve方法,Promise.reject方法

將現(xiàn)有對(duì)象轉(zhuǎn)我Promise對(duì)象,Promise.resolve方法就起到這個(gè)作用。

var jsPromise = Promise.resolve($.ajax("/whatever.json"));

上面jQuery生成defferred對(duì)象,轉(zhuǎn)為一個(gè)新的ES6的Promise對(duì)象。
如果Promise.resolve方法的參數(shù),不具有then方法的對(duì)象(又稱(chēng)thenable對(duì)象),則返回一個(gè)新的Promise對(duì)象,且他的狀態(tài)為fulfilled.

var p = Promise.resolve("Hello");
p.then(function(s){
    console.log(s)
})
//Hello

上面生成一個(gè)新的Promise對(duì)象的實(shí)例p,它的狀態(tài)為fulfilled。
Promise.reject(reason)方法也會(huì)返回一個(gè)新的Promise實(shí)例,該實(shí)例的狀態(tài)為rejected,Promise.reject方法的參數(shù)reason,會(huì)被傳遞給實(shí)例的回調(diào)函數(shù)。

async函數(shù)

async函數(shù)是用來(lái)取代回調(diào)函數(shù)的另一種方法。只要函數(shù)之前加上async的關(guān)鍵字,就表明該函數(shù)內(nèi)部有異步操作。該異步操作返回一個(gè)Promise對(duì)象,前面用await關(guān)鍵字注明。當(dāng)函數(shù)執(zhí)行的時(shí)候,一旦遇到await就立馬返回,等接觸到異步操作完成,再接著執(zhí)行函數(shù)體內(nèi)后面的語(yǔ)句。

async function getStockPrice(symbol, currency) {
    let price = await getStockPrice(symbol);
    return convert(price, currency);
}

函數(shù)前面加了一個(gè)async表明該函數(shù)將返回一個(gè)Promise對(duì)象,調(diào)用該函數(shù)時(shí),遇到await關(guān)鍵字,立刻返回后面的表達(dá)式產(chǎn)生的Promise對(duì)象,不再執(zhí)行函數(shù)體后面的語(yǔ)句。等getStockPrice完成,在自動(dòng)回到函數(shù)體內(nèi),執(zhí)行剩下的語(yǔ)句。

function timeout(ms) {
  return new Promise((resolve) => {
    setTimeout(resolve, ms);
  });
}

async function asyncValue(value) {
  await timeout(50);
  return value;
}

上面代碼中,asyncValue函數(shù)前面有async關(guān)鍵字,表明函數(shù)體內(nèi)有異步操作。執(zhí)行的時(shí)候,遇到await語(yǔ)句就會(huì)先返回,等到timeout函數(shù)執(zhí)行完畢,再返回value。

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

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

相關(guān)文章

  • Promise的幾個(gè)擴(kuò)展API總結(jié)

    摘要:的幾個(gè)擴(kuò)展總結(jié)描述和相反,當(dāng)所有的被拒絕之后,方法執(zhí)行完成的決議,如果存在一個(gè)執(zhí)行完成的決議,方法則執(zhí)行拒絕里邊的所有實(shí)例反過(guò)來(lái)就好了執(zhí)行到此執(zhí)行到此描述忽略被拒絕的,只需要有一個(gè)完成的,方法就執(zhí)行完成操作,如果全部的都被拒絕,方法執(zhí)行拒絕 Promise的幾個(gè)擴(kuò)展API總結(jié) 1. Promise.none 描述: 和 Promise.all 相反,當(dāng)所有的promise被拒絕之后,n...

    李義 評(píng)論0 收藏0
  • 異步發(fā)展流程 —— 手寫(xiě)一個(gè)符合 Promise/A+ 規(guī)范的 Promise

    摘要:構(gòu)造函數(shù)的實(shí)現(xiàn)我們?cè)谑褂玫臅r(shí)候其實(shí)是使用關(guān)鍵字創(chuàng)建了一個(gè)的實(shí)例,其實(shí)是一個(gè)類(lèi),即構(gòu)造函數(shù),下面來(lái)實(shí)現(xiàn)構(gòu)造函數(shù)。 showImg(https://segmentfault.com/img/remote/1460000018998456); 閱讀原文 概述 Promise 是 js 異步編程的一種解決方案,避免了 回調(diào)地獄 給編程帶來(lái)的麻煩,在 ES6 中成為了標(biāo)準(zhǔn),這篇文章重點(diǎn)不是敘...

    UnixAgain 評(píng)論0 收藏0
  • Promise 對(duì)象的理解

    摘要:使用對(duì)象的好處在于可以將異步操作以同步操作的流程表達(dá)出來(lái),避免了層層嵌套的回調(diào)函數(shù)。對(duì)象異步操作拋出錯(cuò)誤,狀態(tài)就會(huì)變?yōu)椋蜁?huì)調(diào)用方法指定的回調(diào)函數(shù)處理這個(gè)錯(cuò)誤。 Promise 含義 Promise 是異步編程的一種解決方案,比傳統(tǒng)的解決方案——回調(diào)函數(shù)和事件——更合理和更強(qiáng)大。它由社區(qū)最早提出和實(shí)現(xiàn),ES6 將其寫(xiě)進(jìn)了語(yǔ)言標(biāo)準(zhǔn),統(tǒng)一了用法,原生提供了 Promise 對(duì)象。 所謂 P...

    church 評(píng)論0 收藏0
  • Promise 中的三兄弟 .all(), .race(), .allSettled()

    摘要:對(duì)于的來(lái)說(shuō)基元函數(shù)包括組合函數(shù)的類(lèi)型簽名返回情況完成如果傳入的可迭代對(duì)象為空,會(huì)同步地返回一個(gè)已完成狀態(tài)的。相反,如果是在指定的時(shí)間之后完成,剛返回結(jié)果就是一個(gè)拒絕狀態(tài)的從而觸發(fā)方法指定的回調(diào)函數(shù)。在行中,對(duì)每個(gè)小任務(wù)得到的結(jié)果進(jìn)行匯總。 為了保證的可讀性,本文采用意譯而非直譯。 想閱讀更多優(yōu)質(zhì)文章請(qǐng)猛戳GitHub博客,一年百來(lái)篇優(yōu)質(zhì)文章等著你! 從ES6 開(kāi)始,我們大都使用的是 P...

    vspiders 評(píng)論0 收藏0
  • 實(shí)現(xiàn)Promise

    摘要:使用是極好的,它是如此有用以至于我覺(jué)得應(yīng)該好好研究一下,甚至是實(shí)現(xiàn)一個(gè)簡(jiǎn)易的版本。構(gòu)造函數(shù)檢查參數(shù)例如是不是函數(shù)啊初始化,創(chuàng)建對(duì)象執(zhí)行因此構(gòu)造函數(shù)里面?zhèn)魅氲氖橇⒓幢粓?zhí)行的。 使用Promise是極好的,它是如此有用以至于我覺(jué)得應(yīng)該好好研究一下Promise,甚至是實(shí)現(xiàn)一個(gè)簡(jiǎn)易的版本。實(shí)現(xiàn)之前,我們先來(lái)看看Promise的用途: 使用Promise callback hell Promi...

    xcc3641 評(píng)論0 收藏0
  • 【筆記】你不知道的JS讀書(shū)筆記——Promise

    摘要:寫(xiě)在前面這一章的順序?qū)τ谖唇佑|過(guò)使用過(guò)的童鞋而言略抽象了,前邊幾章主要為了說(shuō)明和之前的異步方式相比有什么優(yōu)勢(shì)和它能解決什么問(wèn)題,后邊才詳解的設(shè)計(jì)和各種場(chǎng)景下如何使用。建議先了解和簡(jiǎn)單使用過(guò)后再閱讀,效果更佳。 寫(xiě)在前面:Promise這一章的順序?qū)τ谖唇佑|過(guò)使用過(guò)Promise的童鞋而言略抽象了,前邊幾章主要為了說(shuō)明Promise和之前的異步方式相比有什么優(yōu)勢(shì)和它能解決什么問(wèn)題,后邊才...

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

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

0條評(píng)論

閱讀需要支付1元查看
<