首頁 > web前端 > 前端問答 > promise是es6的嗎

promise是es6的嗎

青灯夜游
發布: 2022-11-03 19:20:55
原創
1914 人瀏覽過

是的。 promise是ECMAScript 6新增的參考類型,表示一個非同步操作的最終完成或失敗。 promise是解決非同步程式呼叫程式碼邏輯編寫過於複雜的問題的,當網路請求非常複雜時,就會出現回調地獄,這樣如果將這些程式碼寫在一起就會看起來很複雜,且不利於閱讀,如果用promise的話就會讓程式碼看起來更美觀優雅。

promise是es6的嗎

本教學操作環境:windows7系統、ECMAScript 6版、Dell G3電腦。

ECMAScript 6 增加了對 Promises/A  規範的完善支持,即 Promise 類型。一推出,Promise 就大受歡迎,成為了主導性的非同步程式設計機制。所有現代瀏覽器都支援 ES6 期約,許多其他瀏覽器 API 也以期約為基礎。

Promise 是 ECMAScript 6 新增的參考類型,表示一個非同步操作的最終完成或失敗。

一、promise函數是做什麼的

promise函數是解決非同步程式呼叫程式碼邏輯編寫過於複雜的問題的,當網路請求非常複雜時,就會出現回調地獄,這樣如果將這些程式碼寫在一起就會看起來很複雜,且不利於閱讀,如果用promise的話就會讓程式碼看起來更加美觀優雅

二、Promise三種狀態

首先, 當我們開發中有非同步操作時, 就可以給非同步操作包裝一個Promise
非同步操作之後會有三種狀態

pending:等待状态,比如正在进行网络请求,或者定时器没有到时间。
fulfill:满足状态,当我们主动回调了resolve时,就处于该状态,并且会回调.then()
reject:拒绝状态,当我们主动回调了reject时,就处于该状态,并且会回调.catch()
登入後複製

#三、實作

1,then和catch

1.出於未決狀態的函數是同步的會立即執行
2.then和catch是異步的就算promise物件裡面沒有非同步操作讓then方法或catch立即執行那麼這裡兩個方法或被加入到事件佇列中等待執行

//参数 函数(resolve,reject)
    new Promise((resolve, reject) => {
        setTimeout(() => {
            //请求成功的时候调用resolve
            resolve('22222')
            //请求失败的时候调用reject
            reject('error message')
        }, 1000)
    }).then((data) => { //请求成功处理函数
        console.log(data)
    }).catch((err) => { //请求失败处理函数
        console.log(err)
    })
登入後複製

2.確定狀態

1、在未決狀態的處理函數中如果發生未捕獲的錯誤呀那麼狀態就會有pending 直接變成rejected狀態並且可以被catach捕獲

var pro = new Promise((resolve, reject) => {
            throw new Error("123");

            // try{
            //     throw new Error("123"); 
            // } catch(e) {}

            resolve(12);
            reject(34);
        })

        // pro.then(data => {
        //     console.log(data);
        // }, err => {
        //     console.log(err);
        // })


        console.log(pro);
        

        pro.then(data => {
            console.log(data);
            
        })

        pro.catch(data => {
            console.log(data);
            
        })
登入後複製

3.async和await

1.使用Promise:

const makeRequest = () =>
        getJSON().then(data => {
            console.log(data)
            return "done"
        })

    makeRequest()
登入後複製

2.使用Async :

async和await 是ES7提出來的
# async作用:簡化函數傳回值中promise物件的建立
# 一般情況下, async寫在函數的最前面,被修飾的函數的回傳值,一定是promise物件。只有在某些特殊情況下 才會手動回傳一個promise物件。

作用:和promise一樣解決非同步問題但是他的好處在於讓非同步程式碼和同步的一樣!!
注意點: 同步方法我們拿到結果是透過回傳值,非同步方法拿到結果,是靠回呼函數。

async 和await使用的基本語法 :

  • 就是在普通函數前面加一個async 呼叫跟普通函數一樣

  • #async出現使用一般都要和await配合使用

  • await後面接的就是一個promise物件await一定是在非同步函數中使用的

#
const makeRequest = async () => {
 // await getJSON()表示console.log会等到getJSON的promise成功reosolve之后再执行。
        console.log(await getJSON)
        return "done"
    }

    makeRequest()
登入後複製

3.區別

1.函數前面多了一個aync關鍵字。 await關鍵字只能用在aync定義的函數內。 async函數會隱式地回傳一個promise,該promise的reosolve值就是函數return的值。 (範例中reosolve值就是字串”done”)
2.我們不能在最外層程式碼中使用await,因為不在async函數內。

四.promise方法

var r1 = new Promise((resolve,reject) => {
            setTimeout(function(){
                resolve("我是第一个请求");
            },1000)
        })
        var r2 = new Promise((resolve,reject) => {
            setTimeout(function(){
                resolve("我是第二个请求");
            },3000)
        })
        var r3 = new Promise((resolve,reject) => {
            setTimeout(function(){
                resolve("我是第三个请求");
            },4000)
        })
        var r4 = new Promise((resolve,reject) => {
            setTimeout(function(){
                resolve("我是第四个请求");
            },500)
        })
登入後複製

1.all方法

有時候我們需要等待兩個或多個請求都成功回傳了再進行下一步操作,promise 的all方法是等所有的非同步請求完成之後在進行下一步回調

Promise.all([r1,r2,r3,r4]).then(data => {
            console.log(data);
            
        })
登入後複製

2.race方法

請求同時發送出去誰先回來就是用誰的數據。

Promise.race([r1,r2,r3,r4]).then(data => {
           console.log(data);
           
       })
登入後複製

五.promise封裝ajax案例

<script>
       function toData(obj) {
               
               // 声明一个数组 来装每一组的数据
               var arr = [];
               if(obj !== null) {
                   for(var key in obj) {
                       let str = key + "=" + obj[key];
                       arr.push(str);
                   }
                   return arr.join("&");
               }
       }

       function ajax(obj) {
           return new Promise(function(resolve, reject) {
               // 给ajax所需要的参数设置默认值
               obj.type = obj.type || "get";
               obj.async = obj.async|| "true";
               obj.dataType = obj.dataType || "json";
               obj.data = obj.data || null;

               // 开始发送ajax请求
               var xhr;

               if(window.XMLHttpRequest) {
                   xhr = new XMLHttpRequest();
               } else {
                   // IE低版本的浏览器
                   xhr = new ActiveXObject("Microsoft.XMLHttp");
               }

               // 判断是post请求 还是get请求
               if(obj.type === "post") {
                   xhr.open(obj.type, obj.url, obj.async);
                   // 设置请求头
                   xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");

                   xhr.send(toData(obj.data));

               } else {
                   var url = obj.url + "?" + toData(obj.data);
                   xhr.open(obj.type, url, obj.async);
                   xhr.send();
               }

               // 处理响应体
               xhr.onreadystatechange = function() {

                   if(xhr.readyState == 4) {
                       if(xhr.status >= 200 && xhr.status < 300 || xhr.status == 304) {
                           resolve(JSON.parse(xhr.responseText));

                       } else {
                           reject(xhr.status);
                       }
                   }
               }
           })
       }

       ajax({
           url : "./data.php",
           data : {
               name : "jack",
               age : 16
           }
       }).then(res => {
           console.log(res);
           
       }, err => {
           console.log(err);
           
       })
   
   </script>
登入後複製

【相關推薦:javascript影片教學web前端

以上是promise是es6的嗎的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:csdn.net
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板