一、概念

  Promise,从语法上来讲,它是一个对象,是一个构造函数,可以获取 异步操作 的信息。

  简单来讲,就是用同步的方式写异步代码,用来解决回调问题。

二、特点

  Promise 对象有两个特点:

  1、对象的状态不受外界影响。Promise 对象代表一个异步操作,有三种状态:

    (1)、pending: 初始值

    (2)、fulfilled:  操作成功

    (3)、rejected: 操作失败

   只有异步操作的结果可以决定当前是哪一个状态,任何其他状态都无法改变这个状态。

  2、一旦状态改变,就不会再变,任何时候都可以得到这个结果。

    Promise对象的状态改变,只有两种可能:从 Pending 变为 Resolved 和 从 Pending 变为 Rejected 。只要这两种情况发生,状态就凝固了,不会再变了,会一直保持这个结果。

  :Promise 一旦新建就会「立即执行」,无法取消(new Promise() 里的函数会自动运行)。

三、Promise 方法

  Promise 除了拥有自身的 all、race、resolve、reject 等方法外,在原型上还拥有 then、catch 方法。

  看下列代码:

function promiseBegin(){
var p = new Promise(function(resolve, reject){
//做一些异步操作
setTimeout(function(){
console.log('代码执行完成');
resolve('回调数据');
       reject('失败回调数据');
}, 2000);
});
return p;
}
promiseBegin();

  当执行 promiseBegin 函数时,会得到一个 Promise 对象,在 Promise 的构造函数中,我们执行了一个setTimeout异步操作,2秒后,输出“代码执行完成”,并且调用resolve方法。

  

  then() 方法

   then() 方法有两个参数,一个是成功 resolve 调用的方法,一个是失败 reject 调用的方法。

promiseBegin().then(function(data){
console.log(data);
//后面可以用传过来的数据做些其他操作
//......
},function(err) {
console.log(err);
});

   catch() 方法

    catch() 方法用于指定发生错误时的回调函数。

promiseBegin().then(function(data){
console.log(data);
//后面可以用传过来的数据做些其他操作
//......
}).catch(function(err){
// 处理失败的操作
console.log(err)
});

    在执行resolve的回调(也就是上面then中的第一个参数)时,如果抛出异常了(代码出错了),那么并不会报错卡死js,而是会进到这个catch方法中。

    一般来说,不要在 then() 方法里面定义 Reject 状态的回调函数(即 then() 的第二个参数),总是使用 catch 方法。

  链式调用

   我们们可以在 then 方法中继续写 Promise 对象并返回,然后继续调用 then 来进行回调操作。

//买笔
function buy(){
console.log("开始买笔");
var p = new Promise(function(resolve,reject){
setTimeout(function(){
console.log("买了笔芯");
resolve("数学作业");
},1000);
});
return p;
}
//写作业
function work(data){
console.log("开始写作业:"+data);
var p = new Promise(function(resolve,reject){
setTimeout(function(){
console.log("写完作业");
resolve("作业本");
},1000);
});
return p;
} function out(data){
console.log("开始上交:"+data);
var p = new Promise(function(resolve,reject){
setTimeout(function(){
console.log("上交完毕");
resolve("得分:A");
},1000);
});
return p;
}
/* 不建议使用这种方式
buy().then(function(data){
return work(data);
}).then(function(data){
return out(data);
}).then(function(data){
console.log(data);
});*/ //推荐这种简化的写法
buy().then(work).then(out).then(function(data){
console.log(data);
});

  all() 方法

    Promise的 all() 方法提供了并行执行异步操作的能力,并且在所有异步操作执行完后才执行回调。

//买作业本
function cutUp(){
console.log('挑作业本');
var p = new Promise(function(resolve, reject){ //做一些异步操作
setTimeout(function(){
console.log('挑好购买作业本');
resolve('新的作业本');
}, 1000);
});
return p;
} //买笔
function boil(){
console.log('挑笔芯');
var p = new Promise(function(resolve, reject){ //做一些异步操作
setTimeout(function(){
console.log('挑好购买笔芯');
resolve('新的笔芯');
}, 1000);
});
return p;
} Promise.all([cutUp(),boil()]).then(function(results){
console.log("写作业的工具都买好了");
console.log(results); // ["新的作业本", "新的笔芯"]
});
  
     

  

  使用场景:预加载图片资源    

  race() 方法

    race() 的用法与 all() 一样,只不过 all() 是等所有异步操作都执行完毕后才执行 then 回调。而 race() 的话只要有一个异步操作执行完毕,就立刻执行 then 回调。

    注意:其它没有执行完毕的异步操作仍然会继续执行,而不是停止。

 Promise.race([cutUp(), boil()]).then(function(results){
console.log("哈哈,我先买好啦");
console.log(results);
});

      

  使用场景:图片请求超时

function requestImg(){
var p = new Promise(function(resolve, reject){
var img = new Image();
img.onload = function(){
resolve(img);
}
img.src = 'xxxxxx';
});
return p;
} //延时函数,用于给请求计时
function timeout(){
var p = new Promise(function(resolve, reject){
setTimeout(function(){
reject('图片请求超时');
}, 5000);
});
return p;
} Promise.race([requestImg(), timeout()]).then(function(results){
console.log(results);
}).catch(function(reason){
console.log(reason);
});
//上面代码 requestImg 函数异步请求一张图片,timeout 函数是一个延时 5 秒的异步操作。我们将它们一起放在 race 中赛跑。
//如果 5 秒内图片请求成功那么便进入 then 方法,执行正常的流程。
//如果 5 秒钟图片还未成功返回,那么则进入 catch,报“图片请求超时”的信息。

  

随笔整理自
  http://es6.ruanyifeng.com/#docs/promise
  https://www.cnblogs.com/ainyi/p/8665272.html
感谢博主分享!

ES6 Promise 详解的更多相关文章

  1. ES6 Promise详解

    前言 本文主要是对Promise本身的用法做一个全面解析而非它的原理实现,如果你对Promise的用法还不是很熟悉或者想加深你对Promise的理解,我相信这篇文章一定会帮到你. 首先让我们先了解一下 ...

  2. es6语法详解

    什么是ECMAScript? ECMAScript是浏览器脚本语言的规范,而我们熟知的js语言,如JavaScript则是规范的具体实现.es6就好比Java的jdk. 一.es6语法详解:let声明 ...

  3. Es6主要特征详解

    一.简介 本文将对es6的最佳特性进行分享和讲解.es6也称ES6/ECMAScript2015,在2015年诞生,但是目前实际开发中还很多用的是ES5(2009年),原因就是很多的浏览器不支持新的语 ...

  4. angular $q promise详解

    前言 通过本文,你大概能清楚angular promise是个啥,$q又是个啥,以及怎么用它.这里咱们先灌输下promise的思想. 下面写的全是废话,一些看着高逼格其实没什么大作用的概念,想知道$q ...

  5. ES6中的Promise详解

    Promise 在 JavaScript 中很早就有各种的开源实现,ES6 将其纳入了官方标准,提供了原生 api 支持,使用更加便捷. 定义 Promise 是一个对象,它用来标识 JavaScri ...

  6. ES6 中 Promise 详解

    Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果.从语法上说,Promise 是一个对象,从它可以获取异步操作的消息.Promise 提供统一的 API ...

  7. ES6中Promise详解

    Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果.从语法上说,Promise 是一个对象,从它可以获取异步操作的消息. Promise 提供统一的 AP ...

  8. ES6新增语法(五)——Promise详解

    Promise介绍 promise是一个对象,从它可以获取异步操作的消息.有all.race.reject.resolve这几个方法,原型上有then.catch等方法. Promise的两个特点: ...

  9. js中的promise详解

    一 概述   Promise是异步编程的一种解决方案,可以替代传统的解决方案--回调函数和事件.ES6统一了用法,并原生提供了Promise对象.作为对象,Promise有一下两个特点: (1)对象的 ...

随机推荐

  1. [20181116]18c DML 日志优化.txt

    [20181116]18c DML 日志优化.txt 1.环境:xxxxxxxx> select banner_full from v$version;BANNER_FULL---------- ...

  2. 自动化测试基础篇--Selenium文件上传send_keys

    摘自https://www.cnblogs.com/sanzangTst/p/8358165.html 文件上传是web页面上很常见的一个功能,自动化成功中操作起来却不是那么简单. 一般分两个场景:一 ...

  3. 多文档界面的实现(DotNetBar的superTabControl)

    private void FormMain_Load(object sender, EventArgs e) { superTabControl2.Tabs.Clear(); timer1.Start ...

  4. Python 面向对象的特性2-----继承

    面向对象的三大特性 1.封装 根据职责将属性和方法封装到一个抽象的类中,然后类创建一个实实在在的对象,有了对象以后,就可以访问到对象内部的属性,或者让对象来调用一个已经封装好的方法. 2.继承 实现代 ...

  5. Linux 小知识翻译 - 「cron」

    这次说说「cron」. 「cron」就是「定期自动执行任务的工具」(相当于windows中的计划任务).读做「库隆」.使用「cron」,可以预先指定任务在某个时间执行. 时间的指定并不只是「一小时一次 ...

  6. May 23. 2018 Week 21st Wednesday

    You should love and take care of yourself because after all, it is your own life. 要学会爱自己,照顾自己,毕竟生活是你 ...

  7. JavaScript数据类型之布尔类型

    引言 布尔值指代真或假.开或关.是或否.这个类型只有两个值,保留字true和false.JavaScript程序中的比较语句的结果通常都是布尔值.布尔值通常用于JavaScript中的控制结构中. 真 ...

  8. C#语言のC#扩展方法(.Net特性)

    this在C#中的常见用法:1.在C#中,this关键字代表当前实例,我们可以用this.来调用当前实例的成员方法,变量,属性,字段等; 2.也可以用this来做为参数状当前实例做为参数传入方法. 3 ...

  9. Linux vi/vim编辑器

    所有的 Unix Like 系统都会内建 vi 文书编辑器,其他的文书编辑器则不一定会存在. 但是目前我们使用比较多的是 vim 编辑器. vim 具有程序编辑的能力,可以主动的以字体颜色辨别语法的正 ...

  10. git 冲突解决的方法

    版权声明:本文为博主原创文章,未经博主同意不得转载. 新博客地址:www.atomicdevelop.com https://blog.csdn.net/believer123/article/det ...