国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > JS > 正文

ES6 Promise對象的應用實例分析

2024-05-06 16:52:50
字體:
來源:轉載
供稿:網友

本文實例講述了ES6 Promise對象的應用。分享給大家供大家參考,具體如下:

The Promise object represents the eventual completion (or failure) of an asynchronous operation, and its resulting value.

Promise 對象用于一個異步操作的最終完成(或失敗)及其結果值的表示。簡單點說,它就是用于處理異步操作的,異步處理成功了就執行成功的操作,異步處理失敗了就捕獲錯誤或者停止后續操作。

在promise之前處理異步回調的方式

function asyncFun(a,b,callback) {   setTimeout(function () {    callback(a+b);   },200);  }  asyncFun(1,2, function (res) {   if(res > 2) {    asyncFun(res, 2, function (res) {     if(res > 4) {      asyncFun(res, 2, function (res) {       console.log('ok');       console.log(res);      })     }    })   }  });

從上面可以看出所謂的”回調地獄”的可怕

使用promise來優雅的處理異步

function asyncFun(a,b) { return new Promise(function (resolve, reject) {  setTimeout(function() {   resolve(a + b);  },200); })}asyncFun(1,2).then(function (res) { if(res > 2) {  return asyncFun(res, 2); }}).then(function (res) { if(res > 4) {  return asyncFun(res, 2); }}).then(function (res) { console.log('ok'); console.log(res);}).catch(function (error) { console.log(error);});

使用promise處理內部異常的舉例

function asyncFun(a,b) { return new Promise(function (resolve, reject) {  // 模擬異常判斷  if(typeof a !== 'number' || typeof b !== 'number') {   reject(new Error('no number'));  }  setTimeout(function() {   resolve(a + b);  },200); })}asyncFun(1,2).then(function (res) { if(res > 2) {  return asyncFun(res, 2); }},function (err) { console.log('first err: ', err);}).then(function (res) { if(res > 4) {  return asyncFun(res, 'a'); }},function (err) { console.log('second err: ', err);}).then(function (res) { console.log('ok'); console.log(res);},function (err) { console.log('third err: ', err);});

從上面可以看出通過then的第二個回調函數處理promise對象中的異常,通過reject返回異常的promise對象

通過catch統一處理錯誤,通過finally執行最終必須執行的邏輯

function asyncFun(a,b) { return new Promise(function (resolve, reject) {  // 模擬異常判斷  if(typeof a !== 'number' || typeof b !== 'number') {   reject(new Error('no number'));  }  setTimeout(function() {   resolve(a + b);  },200); })}asyncFun(1,2).then(function (res) { if(res > 2) {  return asyncFun(res, 2); }}).then(function (res) { if(res > 4) {  return asyncFun(res, 'a'); }}).then(function (res) { console.log('ok'); console.log(res);}).catch(function (error) { console.log('catch: ', error);}).finally(function () { console.log('finally: ', 1+2);});

通過Promise.all()靜態方法來處理多個異步

function asyncFun(a,b) { return new Promise(function (resolve, reject) {  setTimeout(function() {   resolve(a + b);  },200); })}var promise = Promise.all([asyncFun(1,2), asyncFun(2,3), asyncFun(3,4)])promise.then(function (res) { console.log(res); // [3, 5, 7]});

通過Promise.race()靜態方法來獲取多個異步中最快的一個

function asyncFun(a,b,time) { return new Promise(function (resolve, reject) {  setTimeout(function() {   resolve(a + b);  },time); })}var promise = Promise.race([asyncFun(1,2,10), asyncFun(2,3,6), asyncFun(3,4,200)])promise.then(function (res) { console.log(res); // 5});

通過Promise.resolve() 靜態方法來直接返回成功的異步對象

var p = Promise.resolve('hello');p.then(function (res) { console.log(res); // hello});

等同于,如下:

var p = new Promise(function (resolve, reject) { resolve('hello2');})p.then(function (res) { console.log(res); // hello2});

通過Promise.reject() 靜態方法來直接返回失敗的異步對象

var p = Promise.reject('err')p.then(null, function (res) { console.log(res); // err});

等同于,如下:

var p = new Promise(function (resolve, reject) { reject('err2');})p.then(null, function (res) { console.log(res); // err});

通過一個小例子來測試Promise在面向對象中應用

'use strict';class User{ constructor(name, password) {  this.name = name;  this.password = password; } send() {  let name = this.name;  return new Promise(function (resolve, reject) {   setTimeout(function () {    if(name === 'leo') {     resolve('send success');    }else{     reject('send error');    }   });  }); } validatePwd() {  let pwd = this.password;  return new Promise(function (resolve, reject) {   setTimeout(function () {    if(pwd === '123') {     resolve('validatePwd success');    }else{     reject('validatePwd error');    }   });  }) }}let user1 = new User('Joh');user1.send() .then(function (res) {  console.log(res); }) .catch(function (err) {  console.log(err); });let user2 = new User('leo');user2.send() .then(function (res) {  console.log(res); }) .catch(function (err) {  console.log(err); });let user3 = new User('leo', '123');user3.validatePwd() .then(function (res) {  return user3.validatePwd(); }) .then(function (res) {  console.log(res); }) .catch(function(error) {  console.log(error); });let user4 = new User('leo', '1234');user4.validatePwd() .then(function (res) {  return user4.validatePwd(); }) .then(function (res) {  console.log(res); }) .catch(function(error) {  console.log(error); });

希望本文所述對大家JavaScript程序設計有所幫助。


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 什邡市| 高唐县| 浮梁县| 天水市| 腾冲县| 会同县| 雅江县| 桐庐县| 德江县| 普安县| 嘉荫县| 徐汇区| 嵩明县| 盈江县| 舒兰市| 林口县| 平凉市| 白玉县| 德格县| 宜黄县| 收藏| 德庆县| 响水县| 万荣县| 清镇市| 扎鲁特旗| 连南| 顺昌县| 会同县| 蓝田县| 铁岭市| 武鸣县| 黄平县| 化州市| 南部县| 临西县| 龙州县| 兰溪市| 汶川县| 玉门市| 称多县|