ES6-promise對象

理解

* Promise對象: 代表了未來某個將要發(fā)生的事件(通常是一個異步操作)
* 有了promise對象, 可以將異步操作以同步的流程表達(dá)出來, 避免了層層嵌套的回調(diào)函數(shù)(俗稱'回調(diào)地獄')
* ES6的Promise是一個構(gòu)造函數(shù), 用來生成promise實例

promise 狀態(tài)
pending   進(jìn)行中  ->  初始化 new promise對象時
fulfilled 成功    ->  調(diào)用resolve
rejected  失敗    ->  調(diào)用reject

決議: 狀態(tài)一旦改變就不可修改
pending->fulfilled 成功
pending->rejected 失敗

使用promise基本步驟(2步):

<script type="text/javascript">
// 1.創(chuàng)建promise對象
let promise = new Promise((resolve, reject) => {
    //初始化promise狀態(tài)為 pending
    //執(zhí)行異步操作
    if(異步操作成功) {
        resolve(value);//修改promise的狀態(tài)為fullfilled
    } else {
        reject(errMsg);//修改promise的狀態(tài)為rejected
    }
})
// 2. 調(diào)用promise的then()
promise.then(
    result => console.log(result),
    errorMsg => alert(errorMsg)
)
</script>

promise 執(zhí)行流程 - 異步與同步

1 new promise傳遞的回調(diào)函數(shù), 里面的代碼是同步執(zhí)行 (定時器,ajax只執(zhí)行聲明,懂?)
2 then里的回調(diào)函數(shù) 是異步執(zhí)行 , 看定時器內(nèi)部的執(zhí)行順序


let  promise = new Promise((resolve,reject)=>{
    console.log(1)
    setTimeout(()=>{
        console.log(4);
            
        resolve('6 哈哈 ');//修改promise的狀態(tài)為成功

        console.log(5);
        // reject('呵呵 ');//修改promise的狀態(tài)為失敗
    },2000);
});
console.log(2);
    
promise.then((data)=>{
    console.log(data+'成功');
},(data)=>{
    console.log(data+'失敗');
})
console.log(3);
p.then(()=>{
    //這里都是異步執(zhí)行的代碼
})

.then()
.catch()
.
Promise.all()
//將多個promise對象合并成一個新的promise對象, 調(diào)用resolve傳遞的數(shù)據(jù)會整合成一個數(shù)組
//只有p1、p2、p3的狀態(tài)都為成功,p的狀態(tài)才會為成功
//只要p1、p2、p3之中有一個被失敗,p的狀態(tài)就變成失敗
//參數(shù)若為空數(shù)組的話,會決議為成功
let p = Promise.all([p1,p2....]);
p.then((data)=>{
  data // [data1,data2,....]
})
Promise.race()
//將多個promise對象合并成一個新的promise對象
//一旦p1,p2,p3誰最先決議為 resolve或者reject那么新的promise就是 成功或者失敗
let p = Promise.all([p1,p2....]);
p.then((data)=>{
  data // p1data1
})

案例

<script type="text/javascript">
    //定義一個請求news的方法
    function getNews(url) {
        //創(chuàng)建一個promise對象
        let promise = new Promise((resolve, reject) => {
            //初始化promise狀態(tài)為pending
            //啟動異步任務(wù)
            let request = new XMLHttpRequest();
            request.onreadystatechange = function () {
                if(request.readyState === 4){
                    if(request.status === 200){
                        let news = request.response;
                        resolve(news);
                    }else{
                        reject('請求失敗了。。。');
                    }
                }
            };
            request.responseType = 'json';//設(shè)置返回的數(shù)據(jù)類型
            request.open("GET", url);//規(guī)定請求的方法,創(chuàng)建鏈接
            request.send();//發(fā)送
        })
        return promise;
    }

    getNews('http://localhost:3000/news?id=2')
            .then((news) => {
                console.log(news);
                document.write(JSON.stringify(news));
                console.log('http://localhost:3000' + news.commentsUrl);
                return getNews('http://localhost:3000' + news.commentsUrl);
            }, (error) => {
                alert(error);
            })
            .then((comments) => {
                console.log(comments);
                document.write('<br><br><br><br><br>' + JSON.stringify(comments));
            }, (error) => {
                alert(error);
            })
</script>

</body>

</html>
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容