理解并掌握Promise的用法
前沿:
Promise在处理异步操作非常有用。项目中,与后端进行数据请求的时候经常要用到Promise。我们可以用promise + xhr进行ajax的封装。也可以使用基于promise封装的请求方法(fetch)或者类库(axios)去跟服务器进行交互。当使用fethch或者axios的时候,常常需要对数据请求方法进行二次封装。这就要求我们能够理解并掌握promise的用法。
Promise知识要点:
1、首先区分Promise构造函数和promise对象的概念。
通过Promise构造函数创建promise对象。promise对象是Promise构造函数的一个实例。
var promise1 = new Promise(function(resolve, reject) {
setTimeout(resolve, 100, 'foo');
});
console.log(promise1);
// output: [object Promise]
2、promise对象
概念(有点生硬):promise 对象是一个代理对象(代理一个值),被代理的值在promise对象创建时可能是未知的。它允许你为异步操作的成功和失败分别绑定相应的处理方法(handlers)。 这让异步方法可以像同步方法那样返回值,但并不是立即返回最终执行结果,而是一个能代表未来出现的结果的promise对象。换句话说,promise对象表示一个异步操作的最终状态(完成或失败),以及其返回的值。
2-1、promise的状态类型
a. 一个 promise对象的状态类型:
- pending: 初始状态,既不是成功,也不是失败状态。
- fulfilled: 意味着操作成功完成。
- rejected: 意味着操作失败。
b. promise对象状态改变时,调用的方法。
要点:pending 状态的 promise 对象可能触发fulfilled 状态并传递一个值给相应的状态处理方法,也可能触发失败状态(rejected)并传递失败信息给相应的状态处理方法。当其中任一种情况出现时,promise 对象的 then 方法绑定的处理方法(handlers )就会被调用。then方法包含两个参数:onfulfilled 和 onrejected,它们都是 Function 类型。
当promise状态为fulfilled时,调用 then 的 onfulfilled 方法,当promise状态为rejected时,调用 then 的 onrejected 方法或者catch方法。
特别提示:
1、then方法 的 onrejected 处理方法和catch方法只是语法糖不同。其实是一个东西。
2-2. 如何进行链式操作
要点: 和 Promise.prototype.then 方法返回promise 对象, 并且将以回调的返回值来resolve。Promise.prototype.catch
1、即然then和catch方法调用后,返回一个新的promise对象(则可以进行链式调用了)。
2、新的promise对象初始状态为pedding,以回调函数的返回值来resolve(不是reject),则状态变为fulfilled。所以,再进行链式调用的时候是调用 then 的 onfulfilled 方法。(返回值为error或者回调抛出错误,状态会变为rejected???有待考究下。在不发生意外情况,暂且理解为状态只能变为fulfilled)
3、Promise 构造函数
要点:构造函数主要是用来包装还未支持promises的函数。promise构造函数传入一个带有 resolve 和 reject 两个参数的executor函数。executor函数。Promise构造函数执行时立即调用executor 函数, resolve 和 reject 两个函数作为参数传递给executor(executor 函数在Promise构造函数返回新建对象前被调用)。resolve 和 reject 函数被调用时,分别将promise的状态改为fulfilled(完成)或rejected(失败)。executor 内部通常会执行一些异步操作,一旦完成,可以调用resolve函数来将promise状态改成fulfilled,或者在发生错误时将它的状态改为rejected。如果在executor函数中抛出一个错误,那么该promise 状态为rejected。executor函数的返回值被忽略。
4、promise对象的状态改变时机和值的传递
我的理解是,只要准确的把握promise的状态变化情况,就能运用好promise。
1、由Promise构造函数创建的promise对象,状态由Promise构造函数的executor函数去控制promise的状态。调用executor函数的resolve或reject方法,把值传递下去。
2、当进行链式操作的时候,新的promise对象的状态由上一个then或catch的回调函数去控制promise的状态。用回调函数返回值的形式,把值传递下去。
理解并掌握Promise的用法的更多相关文章
- 整理一下Promise 的用法
Promise 的定义 Pormise是JS的异步编程的一种解决方案,在ES6将其写进了语言标准,提供了原生的Promise对象. Promise简单来理解就是一个容器,里面存放着某个未来才会结束的事 ...
- 全面理解Javascript中Promise
全面理解Javascript中Promise 最近在学习Promise的时候,在网上收集了一些资料,发现很多的知识点不够系统,所以小编特意为大家整理了一些自认为 比较好的文章,供大家更好地学习js中非 ...
- 简单谈谈js中Promise的用法
首先先推荐一篇博文:http://blog.csdn.net/jasonzds/article/details/53717501 这篇博文很清晰的说明了Promise的用法,这里来简单总结一下: Pr ...
- JavaScript异步与Promise基本用法(resolve与reject)
Promise解决的问题相信每个前端都遇到过这样一个问题,当一个异步任务的执行需要依赖另一个异步任务的结果时,我们一般会将两个异步任务嵌套起来,这种情况发生一两次还可以忍,但是发生很多次之后,就形成了 ...
- [js高手之路] es6系列教程 - promise常见用法详解(resolve,reject,catch,then,all,race)
关于promise我在之前的文章已经应用过好几次,如[js高手之路]Node.js+jade+express+mongodb+mongoose+promise实现todolist,本文就来讲解下pro ...
- Promise的用法
promise.then().promise.catch().Promise.all()... Promise 构造函数接受一个函数作为参数,该函数的2个参数分别是 resolve 和 reject. ...
- 通过回调函数的理解来进一步理解ajax及其注意的用法
一,再一次理解回调函数 (function($){ $.fn.shadow = function(opts){ //定义的默认的参数 var defaults = { copies: 5, opaci ...
- ES6关于Promise的用法
Promise 对象用于一个异步操作的最终完成(或失败)及其结果值的表示.简单点说,它就是用于处理异步操作的,异步处理成功了就执行成功的操作,异步处理失败了就捕获错误或者停止后续操作. 它的一般表示形 ...
- 理解和使用Promise.all和Promise.race
一.Pomise.all的使用 Promise.all可以将多个Promise实例包装成一个新的Promise实例.同时,成功和失败的返回值是不同的,成功的时候返回的是一个结果数组,而失败的时候则返回 ...
随机推荐
- 视频系列:RTX实时射线追踪(下)
视频系列:RTX实时射线追踪(下) Key things from part 4 光线有效载荷是从一个着色器传递到另一个着色器的结构. 这一切都发生在RTX的引擎下. 更小的有效载荷要好得多! 新的D ...
- Django框架之路由层汇总
一 Django中路由的作用 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表:你就是以这种方式告诉Django,对于客户端发来 ...
- 在Visual Studio 中使用git——标记(Tag)管理(十)
在Visual Studio 中使用git--什么是Git(一) 在Visual Studio 中使用git--给Visual Studio安装 git插件(二) 在Visual Studio 中使用 ...
- 十一、设置Nginx开机自启动
一.创建nginx.service文件 [root@svr7 ~]# vim /lib/systemd/system/nginx.service [Unit]Description=nginx ser ...
- 自动发布.NET Core Web应用
1 原因和目的 相信很多开发者都需要将自己的编写的应用进行编译并部署到服务器上,这个过程在个人或小型团队的项目中都是一个简单的事情.但是对于并行化开发而言,就需要通过工具来辅助这个过程.于是,我参考了 ...
- Centos flock 防止脚本重复运行
如果crontab设定任务每分钟执行一次,但执行的任务需要花费5分钟,这时系统会再执行导致两个相同的任务在执行.发生这种情况下可能会出现一些并发问题,严重时会导致出现脏数据性能瓶颈等恶性循环.为了防止 ...
- 实验3、Flask数据库操作-如何使用Flask与数据库
1. 实验内容 数据库的使用对于可交互的Web应用程序是极其重要的,本节我们主要学习如何与各种主要数据库进行连接和使用,以及ORM的使用 2. 实验要点 掌握Flask对于各种主要数据库的连接方法 掌 ...
- HTTP客户端连接,选择HttpClient还是OkHttp?
为什么会写这篇文章,起因于和朋友的聊天 这又触及到我的知识盲区了,首先来一波面向百度学习,直接根据关键字httpclient和okhttp的区别.性能比较进行搜索,没有找到想要的答案,于是就去over ...
- 【dp】状压dp
二进制的力量 状态压缩DP 愤怒的小鸟 第一次接触状态压缩DP是在NOIP2016的愤怒的小鸟,当时菜得连题目都没看懂,不过现在回过头来看还是挺简单的,那么我们再来看看这道题吧. 题意&数据范 ...
- 数据泵导出报错ORA-31693 ORA-02354 ORA-01466
1.Oracle数据泵导出schema时有报错: Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - P ...