欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

ES6 Promise對象的應(yīng)用實例分析

 更新時間:2019年06月27日 08:37:05   作者:Johnny丶me  
這篇文章主要介紹了ES6 Promise對象的應(yīng)用,結(jié)合實例形式分析了Promise對象原理與異步處理相關(guān)操作技巧,需要的朋友可以參考下

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

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

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

在promise之前處理異步回調(diào)的方式

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);
      })
     }
    })
   }
  });

從上面可以看出所謂的”回調(diào)地獄”的可怕

使用promise來優(yōu)雅的處理異步

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處理內(nèi)部異常的舉例

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的第二個回調(diào)函數(shù)處理promise對象中的異常,通過reject返回異常的promise對象

通過catch統(tǒng)一處理錯誤,通過finally執(zhí)行最終必須執(zhí)行的邏輯

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()靜態(tài)方法來處理多個異步

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()靜態(tài)方法來獲取多個異步中最快的一個

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() 靜態(tài)方法來直接返回成功的異步對象

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() 靜態(tài)方法來直接返回失敗的異步對象

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在面向?qū)ο笾袘?yīng)用

'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);
 });

更多關(guān)于JavaScript相關(guān)內(nèi)容可查看本站專題:《javascript面向?qū)ο笕腴T教程》、《JavaScript查找算法技巧總結(jié)》、《JavaScript錯誤與調(diào)試技巧總結(jié)》、《JavaScript數(shù)據(jù)結(jié)構(gòu)與算法技巧總結(jié)》、《JavaScript遍歷算法與技巧總結(jié)》及《JavaScript數(shù)學(xué)運算用法總結(jié)

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

相關(guān)文章

  • 上傳圖片js判斷圖片尺寸和格式兼容IE

    上傳圖片js判斷圖片尺寸和格式兼容IE

    這篇文章主要介紹了上傳圖片js判斷圖片尺寸和格式并兼容IE,需要的朋友可以參考下
    2014-09-09
  • JavaScript實現(xiàn)找質(zhì)數(shù)代碼分享

    JavaScript實現(xiàn)找質(zhì)數(shù)代碼分享

    這篇文章主要介紹了JavaScript實現(xiàn)找質(zhì)數(shù)代碼分享,本文直接給出實現(xiàn)代碼,需要的朋友可以參考下
    2015-03-03
  • 詳解JavaScript基本類型和引用類型

    詳解JavaScript基本類型和引用類型

    這篇文章主要介紹了JavaScript基本類型和引用類型,基本類型中還包含了類型轉(zhuǎn)換,感興趣的小伙伴們可以參考一下
    2015-12-12
  • 一文詳解如何檢測并解決JS代碼中的死循環(huán)

    一文詳解如何檢測并解決JS代碼中的死循環(huán)

    這篇文章主要想和大家來一起探討一下能否通過靜態(tài)分析的方式檢測出死循環(huán),如果不能,我們又應(yīng)該如何在不借用其他線程的情況下,解決死循環(huán)卡住問題,感興趣的可以了解下
    2023-09-09
  • 詳解如何在JavaScript中使用for循環(huán)

    詳解如何在JavaScript中使用for循環(huán)

    循環(huán)允許我們通過循環(huán)數(shù)組或?qū)ο笾械捻棽⒆鲆恍┦虑?。在這篇文章中,我們將了解JavaScript提供的for循環(huán),感興趣的小伙伴可以了解一下
    2022-11-11
  • Qt6基于Qml的文件對話框演示效果

    Qt6基于Qml的文件對話框演示效果

    這篇文章主要介紹了Qt6基于Qml的文件對話框演示,包括打開單個文件配置和打開多個文件配置及保存文件配置的方法,本文通過實例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-10-10
  • 詳解JavaScript嚴(yán)格模式的使用方法

    詳解JavaScript嚴(yán)格模式的使用方法

    JavaScript的嚴(yán)格模式(Strict?Mode)是一種在代碼中啟用的特殊模式,用于提供更嚴(yán)格的語法和錯誤檢查,以改善代碼質(zhì)量和增強安全性,本文主要介紹JS的嚴(yán)格模式的用法,可以幫助大家避免一些常見的錯誤,需要的朋友可以參考下
    2023-05-05
  • JGrid中拖動改變列寬的腳本 原型

    JGrid中拖動改變列寬的腳本 原型

    JGrid 中,可以拖動改變列寬,簡單的原理就是改變相應(yīng)的 col 的 style.width 今天看到skybot 同學(xué)在問這個問題,就又把這個功能拿出來,單獨實現(xiàn)了一下(有改進)
    2008-07-07
  • javaScript實現(xiàn)鼠標(biāo)在文字上懸浮時彈出懸浮層效果

    javaScript實現(xiàn)鼠標(biāo)在文字上懸浮時彈出懸浮層效果

    這篇文章主要為大家詳細(xì)介紹了javaScript實現(xiàn)鼠標(biāo)在文字上懸浮時彈出懸浮層效果的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • js實現(xiàn)n秒倒計時后才可以點擊的效果

    js實現(xiàn)n秒倒計時后才可以點擊的效果

    這篇文章主要介紹了js點擊按鈕在倒計時后才可以點擊的效果,需要的朋友可以參考下
    2015-12-12

最新評論