Promise是es6中新增加的类(new Promise),目的为了管理JS中异步编程,也叫“Promise”设计模式

Promise用来解决异步问题。本身是同步的,只是用来管理异步编程的一种模式

所谓Promise,简单说就是一个容器(壳子),里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果

promise对象是一个构造函数,本身有resolve、reject、all方法,原型上有then、catch等方法

三种状态

  • pending 准备状态
  • fulfilled 成功状态(resolve)
  • rejected 失败状态(reject)

最终只有两个状态,1、准备 2、成功或者失败

   let p = new Promise((resolve,reject)=>{
setTimeout(function(){
let txt = '呼伦贝尔';
resolve(txt)//resolve时候执行成功的 呼伦贝尔
//reject(err) //reject时候执行失败的 err
},1000)
});
p.then((data)=>{
console.log(data);
},(err)=>{
console.log('err')
})
/*
1、异步操作放在Promise传的函数里面
2、Promise的参数与 then的参数相对应
*/

Promise对象的特点

  1. Promise对象的状态不受外界影响。只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态
  2. 一旦状态改变,就不会再变。Promise对象的状态改变,只有两种可能:从pending变为fulfilled和从pending变为rejected

promise中excutor执行器,默认new时候会立即调用

每一个promise的实例上都有一个then方法,用来指定resolved和rejected状态的回调函数

其中then方法可以写多个链式调用(前提需要保证执行完then返回的依然是promise实例)

    let pro = new Promise((resolve,reject) =>{
//执行一个异步操作
let xhr = new XMLHttpRequset();
xhr.open('get','1.js',true);
xhr.onreadyStatechange() = function(){
if(xhr.readyState === 4 && xhr.status === 200){
val = xhr.responseText;
resolve(val);//成功
}
if(xhr.status!==200){
reject();//失败
}
}
xhr.send();
})
pro.then((resolve)=>{
console.log('ok');
//数据绑定
},(reject)=>{
console.log('error');
}).then(()=>{
//当第一个then中的函数执行完,会执行第二个
}).then(()=>{
//当第二个then中的函数执行完,会执行第三个
})

promise支持多个并发的请求,获取并发中的数据

Promise请求过来的数据,可能是null,也可能是数组,是数组就进then()遍历,返回的null不需要then()

promise.prototype.catch()

该方法是.then(null, rejection)的别名,用于指定发生错误时的回调函数

 getJSON('/bosh.json').then(function(bosh){
//...
}).catch(function(err){
// 处理 getJSON 和 前一个回调函数运行时发生的错误
console.log('发生错误!', error);
})

一般来说,不要在then方法里面定义reject 状态的回调函数(即then的第二个参数)

也就是在then里面执行成功信息,在catch里面执行错误信息

  // 不推荐
promise
.then(function(data) {
// success
}, function(err) {
// error
}); // 推荐
promise
.then(function(data) { //cb
// success
})
.catch(function(err) {
// error
});

promise.all

Promise.all方法用于将多个 Promise 实例,包装成一个新的 Promise 实例。返回的每个成员都是 Promise 实例

等待所有的promise都成功执行then,反之只要有一个失败就会执行catch

Promise.all([p1,...]).then();

Promise异步操作的更多相关文章

  1. ES6 Promise 异步操作

    最近越来越喜欢与大家进行资源分享了,并且及时的同步到自己的园子内,为什么呢? 一.小插曲(气氛搞起) 在上个月末,由于领导的高度重视(haha,这个高度是有多高呢,185就好了),走进了公司骨干员工的 ...

  2. promise实现原理

    先看的这篇有问题的文章 花了很长时间研究这篇文章,卡在实现串行Promise那儿了,一直看不明白.就在刚才,发现这篇文章是错的,在第一次用setTimeout( ,0)那儿就错了.虽然用setTime ...

  3. 手把手教你实现一个完整的 Promise

    用过 Promise,但是总是有点似懂非懂的感觉,也看过很多文章,还是搞不懂 Promise的 实现原理,后面自己边看文章,边调试代码,终于慢慢的有感觉了,下面就按自己的理解来实现一个 Promise ...

  4. Promise和异步编程

    前面的话 JS有很多强大的功能,其中一个是它可以轻松地搞定异步编程.作为一门为Web而生的语言,它从一开始就需要能够响应异步的用户交互,如点击和按键操作等.Node.js用回调函数代替了事件,使异步编 ...

  5. 对于ES6中Promise的个人见解

    1.js中常见的异步 JavaScript可以响应用户的一些异步交互,比如单击鼠标和按键盘等操作. let button = document.getElementById("btn&quo ...

  6. promise应用及原生实现promise模型

    一.先看一个应用场景 发送一个请求获得用户id, 然后根据所获得的用户id去执行另外处理.当然这里我们完全可以使用回调,即在请求成功之后执行callback; 但是如果又添加需求呢?比如获得用户id之 ...

  7. 30分钟,让你彻底明白Promise原理

    前言 前一阵子记录了promise的一些常规用法,这篇文章再深入一个层次,来分析分析promise的这种规则机制是如何实现的.ps:本文适合已经对promise的用法有所了解的人阅读,如果对其用法还不 ...

  8. 初步认识Promise

    在解释什么是Promise之前,先看一道练习题,做完练习题也就知道Promise到底是干嘛用的了. 假设现在有个需求:你要封装一个方法,我给你一个要读取文件的路径,你这个方法能帮我读取文件,并把内容返 ...

  9. promise的生命周期

    每个promise都会经历一个短暂的生命周期: 先是处于进行中(pending)状态,此时操作并未完成,所以他也是未处理的(unsettled): 一旦异步惭怍执行结束,promise则 变为已处理( ...

随机推荐

  1. PHP程序污点型漏洞静态检测方法

    这篇文献,作者针对基于PHP语言开发的web应用程序产生的污点型漏洞,提出了一种静态代码分析检测的方法.       先解释一下什么叫污点型漏洞,由于对于用户的输入没有进行有效的过滤,使其进入敏感函数 ...

  2. Json多层对象访问

    背景说明 本文主要记录演示,利用Gson工具,对多层的 Json 数据进行转换读取的示例.原始 Json 字符串格式化效果如下: 示例代码 import java.util.Iterator; imp ...

  3. Eclipse编程中免除alt+斜杠,设置自动提示

    用eclipse进行编程时,设置自动提示 .abcdefghijklmnopqrstuvwxyz@

  4. supervisord支持扩展(xml RPC API & Third Party Applications and Libraries)

    XML-RPC API Documentation http://www.supervisord.org/api.html Third Party Applications and Libraries ...

  5. Linux中断管理

    CPU和外设之间的交互,或CPU通过轮询机制查询,或外设通过中断机制主动上报. 对大部分外设中断比轮询效率高,但比如网卡驱动采取轮询比中断效率高. 这里重点关注ARM+Linux组合下中断管理,从底层 ...

  6. PHP处理XML文档,没有CDATA部分数据处理

    在博客备份时,导出了所有文章,导出是xml文档,文章内容在CDATA部分. 这里介绍下XML中CDATA: 所有 XML 文档中的文本均会被解析器解析.只有 CDATA 区段(CDATA sectio ...

  7. CF618F Double Knapsack 构造、抽屉原理

    传送门 首先,选取子集的限制太宽了,子集似乎只能枚举,不是很好做.考虑加强限制条件:将"选取子集"的限制变为"选取子序列"的限制.在接下来的讨论中我们将会知道: ...

  8. 横线和文字一排,文字居中显示vertical-align: middle;

    <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>& ...

  9. Spring Cloud 入门教程(七): 熔断机制 -- 断路器

    对断路器模式不太清楚的话,可以参看另一篇博文:断路器(Curcuit Breaker)模式,下面直接介绍Spring Cloud的断路器如何使用. SpringCloud Netflix实现了断路器库 ...

  10. 控制结构(1): 分枝/叶子(branch/leaf)

    // 下一篇:卫语句(guard clause) 典型代码: function doSomething1(){ // ... } function doSomething2(){ // ... } f ...