中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

ES6中Promise對象的作用是什么

發布時間:2021-05-10 17:47:03 來源:億速云 閱讀:251 作者:Leah 欄目:web開發

今天就跟大家聊聊有關ES6中Promise對象的作用是什么,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。

1.Promise的含義

Promise是異步編程的一種解決方案,比傳統的解決方案(回調函數和事件)更合理更強大。

所謂Promise,簡單說就是一個容器,里面保存著某個未來才會結束的事件 (通常是一個異步操作)的結果。從語法上說,Promise是一個對象,從它可以獲取異步操作的消息。

Promise對象有以下2個特點:

1.對象的狀態不受外界影響。Promise對象代表一個異步操作,有三種狀態:Pending(進行中)、Resolved(已完成)和Rejected(已失敗)。只有異步操作的結果,可以決定當前是哪一種狀態,任何其他操作都無法改變這個狀態。這也是Promise這個名字的由來,它的英語意思就是“承諾”,表示其他手段無法改變。

2.一旦狀態改變,就不會再變,任何時候都可以得到這個結果。Promise對象的狀態改變,只有兩種可能:從Pending變為Resolved;從Pending變為Rejected。只要這兩種情況發生,狀態就凝固了,不會再變了,會一直保持這個結果。就算改變已經發生了,你再對Promise對象田靜回調函數,也會立即得到這個結果。這與事件(Event)完全不同,事件的特點是,如果你錯過了它,再去監聽,是得不到結果的。

有了Promise對象,就可以把異步操作以同步操作的流程表達出來,避免了層層嵌套的回調函數。此外,Promise對象提供了統一的接口,使得控制異步操作更加容易。

2.基本用法

ES6規定,Promise對象是一個構造函數,用來生成Promise實例

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

Promise構造函數接受一個函數作為參數,該函數的兩個參數分別是resolve和reject。它們是兩個函數,又JavaScript引擎提供,不是自己部署。

resolve函數的作用,將Promise對象的狀態從“未完成”變成“成功”(即從Pending變為Resolved),在異步操作成功時調用,并將異步操作的結果,作為參數傳遞出去;
reject函數的作用是,在異步操作失敗時調用,并將異步操作報出的錯誤,作為參數傳遞出去。

Promise實例生成以后,可以用then方法分別制定Resolved狀態和Rejected狀態的回調函數:

promise.then(function(value){
 // sucess
},function(error){
 // failure
});

then方法可以接受2個回調函數作為參數,第二個函數是可選的,不一定要提供。這兩個函數都接受Promise對象傳出的值作為參數。

下面是一個Promise對象的簡單例子:

function timeout(ms){
 return new Promise((resolve,reject)=>{
  setTimeout(resolve,ms,'done');
 });
}
timeout(100).then((value)=>{
 console.log(value);
});

上面代碼中,timeout方法返回一個Promise實例,表示一段事件以后才會發生的結果。過了指定的時間(ms參數)以后,Promise實例的狀態變為Resolved,就會觸發then方法綁定的回調函數。

Promise新建后就會立即執行

let promise = new Promise(function(resolve,rejeact){
 console.log('Promise');
 resolve();
});
promise.then(function(){
 console.log('Resolved');
});
console.log('Hi');
// Promise
// Hi
// Resolved

上面代碼中,Promise新建后立即執行,所以首先輸出的是”Promise”,然后then方法指定的回調函數,將在當前腳本所有同步任務執行完才會執行,所以”Resolved”最后輸出。

下面是異步加載圖片的例子:

function loadImageAsync(url){
 return new Promise(function(resolve,reject){
  var image = new Image();
  image.onload = function(){
   resolve(image);
  };
  image.onerror = function(){
   reject(new Error('Could not load image at' + url));
  };
  image.src = url;
 });
}

下面是一個用Promise對象實現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.readyState !== 4){
    return;
   }
   if(this.status === 200){
    resolve(this.response);
   }else{
    reject(new Error(this.statusText));
   }
  }
 });
 return promise;
};
//
getJSON('/posts.jons').then(function(json){
 consoloe.log(json);
},function(error){
 console.log('出錯了');
});

看完上述內容,你們對ES6中Promise對象的作用是什么有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

贺兰县| 马公市| 高青县| 板桥市| 同心县| 广州市| 武平县| 历史| 津市市| 伊金霍洛旗| 西吉县| 辰溪县| 翁牛特旗| 大厂| 汝南县| 环江| 肥城市| 渭南市| 乌拉特后旗| 永定县| 武陟县| 永州市| 万源市| 天等县| 建始县| 开化县| 乌拉特中旗| 怀安县| 阜宁县| 灵寿县| 陇川县| 晋州市| 永福县| 德江县| 会昌县| 故城县| 西峡县| 雷州市| 霍城县| 安图县| 平舆县|