一,何为Promise?

为了直观一点,首先我们采用console.dir(Promise)看一下它的结构组成。

从上面的图片中我们可以到,Promise其实是一个构造函数,它有resolve,reject,race等静态方法;它的原型(prototype)上有then,catch方法,因此只要作为Promise的实例,都可以共享并调用Promise.prototype上面的方法(then,catch),接下来我们试着使用一下Promise。


二,Promise的使用

首先我们来看一下Promise的使用语法:

new Promise(function(resolve,reject){}/*excutor*/);

在实例化Promise时需要传入一个函数excutor作为参数,并且在Promise构造函数执行时同步执行。废话不多说,先看一个简单的实例:

var p = new Promise(function(resolve,reject){var timer = setTimeout(function(){console.log('执行操作1');},1000);});

我们可以看到1s后在控制台输出相应的结果,这就说明在实例化过程中,作为参数的excutor函数也会执行。

从上面的实例中我们看到,excutor函数还有两个参数resolve和reject,其实这两个参数也是函数,在excutor执行时被调用,下面我们具体来谈谈resolve和reject的用法。


三,resolve和reject的具体用法

先来说说resolve的用法

首先我们来看看Promise的几种状态:

  • pending: 初始状态,成功或失败状态。
  • fulfilled: 意味着操作成功完成。
  • rejected: 意味着操作失败。

       当我们在excutor函数中调用resolve方法时,Promise的状态就变成fulfilled,即操作成功状态,还记得上面Promise.prototype上面的then和catch方法吗?当Promise状态为fullfilled状态时执行then方法里的操作,注意了,then方法里面有两个参数onfulfilled(Promise为fulfilled状态时执行) 和onrejected(Promise为rejected状态时执行),步骤如下:

1,实例化Promise(new Promise(function(resolve,reject)))

2,用Promise的实例调用then方法

具体来看下面的例子:

var p = new Promise(function (resolve, reject) {var timer = setTimeout(function () {console.log('执行操作1');resolve('这是数据1');}, 1000);});p.then(function (data) {console.log(data);console.log('这是成功操作');});

简单的理解就是调用resolve方法Promise变为操作成功状态(fulfilled),执行then方法里面onfulfilled里的操作。其实then里面的函数就是我们平时所说的回调函数,只不过在这里只是把它分离出来而已。我们可以看到控制台上的输出结果如下所示:


reject的用法

看了上面的实例,我相信应该也很容易理解reject方法了,就是调用reject方法后,Promise状态变为rejected,即操作失败状态,此时执行then方法里面onrejected操作,上面我们提到了then方法有两个参数,一种是Promise状态为fulfilled时执行(onfullfilled),一种是Promise状态为rejected时执行(onrejected),其实就是类似于jquery里的hover方法里面的两个参数一样,来看看下面的例子:

var p = new Promise(function (resolve, reject) {var flag = false;if(flag){resolve('这是数据2');}else{reject('这是数据2');}});p.then(function(data){//状态为fulfilled时执行console.log(data);console.log('这是成功操作');},function(reason){ //状态为rejected时执行console.log(reason);console.log('这是失败的操作');});

 我们可以看到输出结果:


catch方法

我们注意到除了then方法外,Promise原型上还有另外一个叫catch的方法,那么这个方法的作用是什么呢?其实跟then方法中的第二个参数一样,就是在Promise状态为rejected时执行,then方法捕捉到Promise的状态为rejected,就执行catch方法里面的操作,下面用catch方法改写上面reject用法里面的例子,如下所示:

var p = new Promise(function (resolve, reject) {var flag = false;if(flag){resolve('这是数据2');}else{reject('这是数据2');}});p.then(function(data){console.log(data);console.log('这是成功操作');}).catch(function(reason){console.log(reason);console.log('这是失败的操作');});

执行结果和上面reject用法的例子一样。


为什么会有promise,他的作用是什么?

promise主要是为了解决js中多个异步回调难以维护和控制的问题.

四,为何用Promise

首先我们来看这样一个例子,取4个定时器,设置延迟时间都为1s,然后每隔1s依次在控制台输出‘我’‘爱’‘米’‘饭’的字样。代码如下:

setTimeout(function () {console.log('我');setTimeout(function () {console.log('爱');setTimeout(function () {console.log('米');setTimeout(function () {console.log('饭');}, 1000);}, 1000);}, 1000);}, 1000);

发现什么问题没有?是不是有点感觉回调函数的嵌套有点多,如果有更多的回调函数呢?是不是使代码的可读性和可维护性都大大降低了呢(回调地狱?),这时如果我们使用Promise去实现这个效果,虽然可能代码不会减少,甚至更多,但是却大大增强了其可读性和可维护性。具体看下面例子:

function getStr1() {return new Promise(function (resolve, reject) {setTimeout(function () {resolve('我');}, 1000);});
}
function getStr2() {return new Promise(function (resolve, reject) {setTimeout(function () {resolve('爱');}, 1000);});
}
function getStr3() {return new Promise(function (resolve, reject) {setTimeout(function () {resolve('米');}, 1000);});
}
function getStr4() {return new Promise(function (resolve, reject) {setTimeout(function () {resolve('饭');}, 1000);});
}
getStr1().then(function (data) {console.log(data);return getStr2();
}).then(function (data) {console.log(data);return getStr3();
}).then(function (data) {console.log(data);return getStr4();
}).then(function (data) {console.log(data);
})

执行效果跟上面一样,在这个例子中,将得到Promise实例的过程封装成一个函数(getStr1,getStr2,getStr3,getStr4)并返回一个Promise实例,再用实例去调用相应的then方法,在每个then方法中通过return得到下一级的Promise实例,比如在第一个Promise实例(getStr1())then方法中,通过return返回下一个Promise对象(getStr2()),然后再去调用then方法执行里面的操作,再返回下一个Promise对象(这里是getStr3()),

这样一级一级下去实现了链式调用,虽然代码量增加了,但比起前面的层层嵌套,显然这种方式使得代码更易读更易维护。


小例子:

function checkFunc() {
let p = new Promise(function (resolve, reject) {// 一些比较耗时异步操作if(操作完成标识) {resolve();}
});
p.then(function (data) {layer.confirm('执行下一步操作?', {btn: ['确定', '取消']}, function () {// 确保上面的操作都完成后,才执行下面的操作// 其他操作...});
});
}

本文对Promise的介绍就到这里,欢迎大家指正里面的错误和不准确的地方。


来源于:

https://www.cnblogs.com/homeStrong/p/8231889.html

Promise初步详解(resolve,reject,catch)相关推荐

  1. Promise初步详解(resolve,reject,catch

    Promise其实是一个构造函数,它有resolve,reject,race等静态方法;它的原型(prototype)上有then,catch方法,因此只要作为Promise的实例,都可以共享并调用P ...

  2. 【JavaScript 教程】ES6 中的 Promise对象 详解

    [JavaScript 教程]ES6 中的 Promise对象 详解 1.Promise对象含义 promise是异步编程的一种解决方法. 所谓promise,简单说是一个容器,里面保存着某个未来才会 ...

  3. 【ES6】Promise对象详解

    [ES6]Promise对象详解 一.Promise对象的含义 二.Promise对象的用法 三.Promise对象的几个应用[重点] 1.时间延迟函数 2.图片异步加载 查看更多ES6教学文章: 参 ...

  4. 熔断和降级的初步详解实现(NET Core控制台输出讲解Polly)

    熔断和降级的初步详解实现(NET Core控制台输出讲解Polly) 概述 熔断和降级概念理解 熔断机制概念 降级机制概念 什么是 Polly Polly的基本用法 1.重试策略(Retry) 2.断 ...

  5. promise存在的意义分析resolve reject catch

    简介 new Promise(function(resolve,reject){}); 状态 pending: 初始状态,成功或失败状态. fulfilled: 意味着操作成功完成.对应resolve ...

  6. ES6 之 Promise用法详解

    promise用了这么多年了,一直也没有系统整理过.今天整理整理promise的相关东西,感兴趣的可以一起看一看.我尽量用更容易理解的语言来剖析一下promise 我准备分两篇文章来说明一下promi ...

  7. Promise入门详解和基本用法 我来教你

    JavaScript的执行环境是单线程. 所谓单线程,是指JS引擎中负责解释和执行JavaScript代码的线程只有一个,也就是一次只能完成一项任务,这个任务执行完后才能执行下一个,它会「阻塞」其他任 ...

  8. Javascript Promise用法详解

    1.约定 本文的 demo 代码有些是伪代码,不可以直接执行. 没有特殊说明,本文所有 demo 都是基于 ES6 规范. Object.method 代表是静态方法, Object#method 代 ...

  9. 原生JS实现Promise(详解)

    摘要 首先呢,Promise是异步中比较重要的知识点,学习的最好方法就是掌握它的基本原理. 所以这一篇主要说一下如何用JS来实现一个自己的promise. 构造函数 首先我们来看一下我们是如何使用pr ...

  10. Promise使用详解2(ES6中的Promise)

    2015年6月,  ES2015 (即  ECMAScript 6 . ES6 ) 正式发布.其中  Promise  被列为正式规范,成为  ES6  中最重要的特性之一. 1,then()方法 简 ...

最新文章

  1. 无法访问已释放的对象。 对象名:“System.ServiceModel.Channels.HttpChannelFactory+HttpRequestChannel”。...
  2. wsl2 图形界面_WSL2配置xrdp一键启动至桌面环境
  3. github push时候报错解决方法
  4. VMware 全虚拟打开
  5. 微服务下的APM全链路监控
  6. VS2008 快捷键大全
  7. 这五个网站可以让你免费学习编程,快收藏!
  8. vb与三菱plc以太网通讯_实战演练|三菱触摸屏GOT2000与三菱Q系列以太网通讯
  9. 关于 .Net Core runtimeconfig 文件说明
  10. 【Python 必会技巧】使用 Python 追加写入 json 文件或更改 json 文件中的值
  11. Mybatis-代码走查问题整理
  12. QTreeWidget样式qss
  13. python存储数据到mysql--针对dataframe格式下的
  14. 51c语言单片机io口控制实验报告,51单片机实训报告完整版.doc
  15. Excel分列-字母与汉字(前后)
  16. arcgis小班编号问题 工具箱来喽
  17. RichEdit控件设置默认字体时只对中文起作用,对英文不起作用的解决办法
  18. 刚开发的游戏《天黑请闭眼》
  19. 软件测试工程师简历要怎么写,才能让 HR 看到?
  20. 数据处理案例一之求同存异

热门文章

  1. 论文记录-2017-A review of affective computing: From unimodal analysis to multimodal fusion
  2. 能上QQ但打不开网页的简单修复方法
  3. 一劳永逸安装程序无法继续 Microsoft Runtime DLL 安装程序未能完成安装
  4. JAVA面试常考系列七
  5. 【PHP问题解决办法】Deprecated: Function eregi() is deprecated in
  6. (转)gzip文件格式详解
  7. Golang 1.16 新特性-embed 包及其使用
  8. Day16:C++之STL应用篇(推箱子cxk限定)
  9. 深度思考-不断逼近问题的本质
  10. ioc performanceTest