亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

Promise

laoLiueizo / 876人閱讀

摘要:上面的代碼指定了兩個(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),就是無法取消,一旦新建它就會(huì)執(zhí)行,無法中途取消;其次如果不設(shè)置回調(diào)函數(shù),Promise內(nèi)部拋出的錯(cuò)誤,不會(huì)反應(yīng)到外部;第三Pending狀態(tài)時(shí),無法得知目前進(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è)簡單實(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ì)象,因此可以寫成鏈?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語句捕獲。

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來決定的。如果這三個(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ì)象(又稱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ù)是用來取代回調(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)后面的語句。

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ù)體后面的語句。等getStockPrice完成,在自動(dòng)回到函數(shù)體內(nèi),執(zhí)行剩下的語句。

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語句就會(huì)先返回,等到timeout函數(shù)執(zhí)行完畢,再返回value。

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

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

相關(guān)文章

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

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

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

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

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

    摘要:使用對(duì)象的好處在于可以將異步操作以同步操作的流程表達(dá)出來,避免了層層嵌套的回調(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 將其寫進(jìn)了語言標(biāo)準(zhǔn),統(tǒng)一了用法,原生提供了 Promise 對(duì)象。 所謂 P...

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

    摘要:對(duì)于的來說基元函數(shù)包括組合函數(shù)的類型簽名返回情況完成如果傳入的可迭代對(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博客,一年百來篇優(yōu)質(zhì)文章等著你! 從ES6 開始,我們大都使用的是 P...

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

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

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

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

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

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

0條評(píng)論

閱讀需要支付1元查看
<