是的。 promise是ECMAScript 6新增的參考類型,表示一個非同步操作的最終完成或失敗。 promise是解決非同步程式呼叫程式碼邏輯編寫過於複雜的問題的,當網路請求非常複雜時,就會出現回調地獄,這樣如果將這些程式碼寫在一起就會看起來很複雜,且不利於閱讀,如果用promise的話就會讓程式碼看起來更美觀優雅。
本教學操作環境: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中文網其他相關文章!

在es6中,可以利用“Array.isArray()”方法判断对象是否为数组,若判断的对象是数组,返回的结果是true,若判断对象不是数组,返回的结果是false,语法为“Array.isArray(需要检测的js对象)”。

es6中遍历跟迭代的区别是:遍历强调的是要把整个数据依次全部取出来,是访问数据结构的所有元素;而迭代虽然也是依次取出数据,但是并不保证取多少,也不保证把所有的数据取完,是遍历的一种形式。

在es6中,可用Object对象的is()方法来判断两个对象是否相等,该方法检测两个变量的值是否为同一个值,判断两个对象的引用地址是否一致,语法“Object.is(对象1,对象2)”;该方法会返回布尔值,若返回true则表示两个对象相等。

转换方法:1、利用“+”给数字拼接一个空字符,语法“数字+""”;2、使用String(),可把对象的值转换为字符串,语法“String(数字对象)”;3、用toString(),可返回数字的字符串表示,语法“数字.toString()”。

sort排序是es6中的;sort排序是es6中用于对数组的元素进行排序的方法,该方法默认不传参,按照字符编码顺序进行排序,排序顺序可以是字母或数字,并按升序或降序,语法为“array.sort(callback(a,b))”。

在es6中,assign用于对象的合并,可以将源对象的所有可枚举属性复制到目标对象;若目标对象与源对象有同名属性,或多个源对象有同名属性,则后面的属性会覆盖前面的属性,语法为“Object.assign(...)”

改变方法:1、利用splice()方法修改,该方法可以直接修改原数组的内容,语法为“数组.splice(开始位置,修改个数,修改后的值)”;2、利用下标访问数组元素,并重新赋值来修改数组数据,语法为“数组[下标值]=修改后的值;”。

在es6中,import as用于将若干export导出的内容组合成一个对象返回;ES6的模块化分为导出与导入两个模块,该方法能够将所有的导出内容包裹到指定对象中,语法为“import * as 对象 from ...”。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

Atom編輯器mac版下載
最受歡迎的的開源編輯器

Dreamweaver Mac版
視覺化網頁開發工具

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

DVWA
Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),