理解并掌握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实例.同时,成功和失败的返回值是不同的,成功的时候返回的是一个结果数组,而失败的时候则返回 ...
随机推荐
- NVIDIA安倍架构
NVIDIA安倍架构 NVIDIA Ampere ArchitectureNVIDIA The Heart of the World's Highest-Performing, Elastic Dat ...
- 编译原理-翻译程序(Translator)
分为编译程序(compiler)和解释程序(interpreter) 编译程序:把源程序(高级语言编写)转换成目标程序(汇编语言或机器语言编写). 解释程序:对源程序边翻译边执行. 编译型语言 优点: ...
- pytest初始化与清除(一)
一.初始化函数 1.测试用例级别:def setup() 2.套件级别(在模块文件中定义):def setup_module() 3.套件级别(在类中定义): @classmethod def set ...
- Open C
Open C UF 公共类型UF_ABORT 进度中断UF_ASSEMUF_ATTRUF_BOUNDUF_BREPUF_CAMUF_CFIUF_CGMUF_CLEARUF_CLONE ...
- UF_OBJ 对象操作
Open C uc5027uc5028uc5029uc502auc502euc502muc502nuc502ruc5203uf5025uf5026UF_OBJ_ask_cre_mod_versions ...
- SQL 查询语句总是先执行 SELECT?你们都错了
很多 SQL 查询都是以 SELECT 开始的.不过,最近我跟别人解释什么是窗口函数,我在网上搜索"是否可以对窗口函数返回的结果进行过滤"这个问题,得出的结论是"窗口函数 ...
- Visual Studio 2019本地不能运行Azure Functions
最近一个项目,需要维护同事写得代码,主要是一堆基于 .net core 3.1 的 Azure Functions.想起2年前第一次接触 Azure Functions(那次是基于.net frame ...
- bzoj2839 集合计数(容斥+组合)
集合计数 内存限制:128 MiB 时间限制:1000 ms 标准输入输出 题目描述 一个有N个元素的集合有2^N个不同子集(包含空集),现在要在这2^N个集合中取出若干集合(至少一个),使得 ...
- Spring Cloud Data Flow整合Cloudfoundry UAA服务做权限控制
我最新最全的文章都在南瓜慢说 www.pkslow.com,欢迎大家来喝茶! 1 前言 关于Spring Cloud Data Flow这里不多介绍,有兴趣可以看下面的文章.本文主要介绍如何整合Dat ...
- dev下拉框选择不同值显示不同控件
单列的ASPxFormLayout直接前台控制就可以了,多列的前台控制后会出现空白 <dx:LayoutItem Caption="内容类型" Height="40 ...