vlambda博客
学习文章列表

JS中异步编程解决方案Promise



一、Promise简介


01. 基础简介


Promise  是一个对象,它代表了一个异步操作的最终完成或者失败
我们打印Promise对象,发现Promise对象上有很多方法:



  • 实例方法:catch、then、finally

在prototype属性上,根据构造函数的知识,我们知道实例都可以访问到构造函数原型上的方法。

  • 对象方法:race、all、reject、resolve


02. Promise方法


  • 实例方法:

catch :捕获异步任务异常信息
then  :捕获异步任务正确结果
finally:异步任务成功与否都会执行
  • 对象方法:

call :并发处理多个任务,所有任务执行完才得到结果
race:并发处理多个任务,只要有一个任务执行完就能得到结果
resolve:异步任务成功之后的回调函数
reject  :异步任务失败之后的回调函数


03. 基本用法


Promise是个对象,也是个构造函数

Promise是一个构造函数,就可以new出一个实例。

Promise的基本用法就是在构造函数中传递函数,在函数中传递resolvereject方法作为成功和失败后的处理方法,然后then方法处理结果。

  • 方式一:

在then的第一个方法里处理成功的结果,在then的第二个方法里处理失败的结果

var p = new Promise(function (resolve, reject) { // 这里用于实现异步任务});p.then(function (data) { // 捕获异步任务正确结果}, function (info) { // 捕获异步任务异常信息});
  • 方式二:

在then里处理成功的结果,在catch里处理失败的结果

var p = new Promise(function (resolve, reject) { // 异步任务});p.then(function(data){ // 捕获异步任务正确结果}).catch(function(data){ // 捕获异步任务异常信息}).finally(function(){ // 成功和失败都会执行});

二、Promise作用


主要作用就是解决异步回调问题,

传统处理异步的方式是通过嵌套实现的:

$.ajax({ url: 'xxx1',    successfunction (data{ $.ajax({ url: 'xxx2',            successfunction (data{ $.ajax({ url: 'xxx3', success: function (data) { console.log(data) } }); } }); }});

我们用Promise解决,封装一个ajax请求

function queryAjax(url) { var p = new Promise(function (resolve, reject) { var xhr = new XMLHttpRequest(); xhr.onreadystatechange = function () { if (xhr.readyState != 4) return;            if (xhr.readyState == 4 && xhr.status == 200) { resolve(xhr.responseText); } else {                reject('err'); } }; xhr.open('get', url); xhr.send(null); }); return p;}
queryAjax('xxx1') .then(function (data) { return queryData('xxx2'); }) .then(function (data) { return queryData('xxx3'); }) .then(function (data) {                console.log(data)  });

三、Promise会马上执行


console.log('1');new Promise(function (resolve, reject) { console.log('2')})console.log('3');

执行的顺序依次是1,2,3;


四、race和all区别


call :并发处理多个任务,所有任务执行完才得到结果
race:并发处理多个任务,只要有一个任务执行完就能得到结果
1. race
Promise.race([p1,p2,p3]).then(function(result){ console.log(result)})

result只能得到最先结束异步任务的对象的结果


2. all

Promise.all([p1,p2,p3]).then(function(result){ console.log(result)})

result可以得到所有异步对象的结果


五、Promise  三个状态  


pending:未处理 初始状态
fulfilled :成功状态
rejected:失败状态
  • 同一时间只能存在一种状态,且状态不可逆。

  • 状态变化只能从pending到 resolved,或者pending 到 rejected。



六、Promise缺点  


  • 无法取消Promise,一旦创建就会立马执行,不能中途取消。

  • Promise的状态分为了三种,但是无法得知具体详细状态,例如:目前状态是在pending刚开始还是要结束。


References

简书https://www.jianshu.com/p/dc61ea153874

mdn

  



JS中异步编程解决方案Promise 


Readings

      为什么我们本能地怕蛇而不是枪?

      把蛇或蛇的图片拿出来会惹得成年的新几内亚人发笑。蛇根本吓不倒他。

      我们的大脑是由基因构筑的,而这些基因中不存在金钱世界的优胜者。在往身上增加脂肪这方面,我们拥有强大的本能,而关心金钱的本能还没来得及演化出来。

-- [美]特里·伯纳姆 [美]杰伊·费伦《本能:为什么我们管不住自己?》




END






JS中异步编程解决方案Promise
JS中异步编程解决方案Promise

扫描二维码更精彩

JS中异步编程解决方案Promise



关注有惊喜