简介


promise对象可以获取异步操作的消息,提供统一的API,各个异步操作都可以用同样的方法进行处理。

promise对象不受外界影响,其有三种状态:pending(进行中)、fulfilled(成功)、rejected(失败),只有异步操作的结果可以决定当前状态,一旦状态改变就不可以再变化,状态改变方向有两种:pending -> fulfilledpending -> rejected

promise对象的意义就在于将异步操作以同步操作的流程表达,避免层层嵌套的回调函数

基本用法

let promise = new Promise(function (resolve, reject) {
if () {
resolve(value) // 异步操作成功
} else {
reject(error) // 失败抛错
}
})

Promise构造函数接受一个函数作为参数,该函数有两个参数:resolvereject,当执行resolve函数时Promise对象状态pending -> fulfilled,当执行reject时Promise对象状态pending -> rejected

promise.then(function (value) {

}, function (error) {

})

Promise实例生成以后,可以用then方法分别指定resolved状态和rejected状态的回调函数,第二个参数为可选参数,例子:

let promise = new Promise(function (resolve, reject) {
console.log('promise')
resolve('11')
})
promise.then(function (value) {
console.log(value)
})
console.log('22')

执行结果'promise -> 22 -> 11',promise对象新建后立即执行,then方法的回调会在所有同步任务执行完成后执行

catch

promise.prototype.catch()then()方法的别名,用于指定发生错误时的回调函数

new Promise(function () {

}).then(() => {

}).catch(err => {
console.log(err)
})

如果异步操作抛出错误,状态就会变为reject,就会调用catch中的回调,当状态为resolve,执行then方法中的回调时,若报错同样回进入catch的回调

意义:当我们使用promise异步操作时,但是没有使用catch捕获错误时,若promise异步执行报错时,外部代码并不会接收到错误,而是继续执行不受影响

const someAsyncThing = function() {
return new Promise(function(resolve, reject) {
resolve(x);
});
};
someAsyncThing().then(function() {
console.log('ok');
});
setTimeout(() => { console.log('continue') }, 100);

如代码所示,x变量并没有定义,期待的操作是执行报错,然后停止运行,实际上continue会执行输出,这说明当没有catch捕获错误时,外部代码不会知道Promise对象内部执行已经报错,因此会继续执行。

finally

不管Promise对象最后结果如何,都会执行的操作,finally方法中的回调函数不接受任何参数

promise
.then(result => {···})
.catch(error => {···})
.finally(() => {···});

all

Promise.all方法用于将多个Promise实例包装成一个新的实例

Promise.all([p1,p2,p3]).then((array) => {

}).catch((err) => {

})

只有p1p2p3的状态都变成fulfilledp的状态才会变成fulfilled,此时p1p2p3的返回值组成一个数组,传递给p的回调函数。

只要p1p2p3之中有一个被rejectedp的状态就变成rejected,此时第一个被reject的实例的返回值,会传递给p的回调函数。

Promise对象入门的更多相关文章

  1. ES6入门之Promise对象

    1. Promise 的含义 Promise 是异步编程的一种解决方案,比传统的解决方案--回调函数和事件更合理.更强大. 1.1 什么是Promise 简单来说就是一个容器,里面保存着某个未来才会结 ...

  2. JavaScript异步编程(1)- ECMAScript 6的Promise对象

    JavaScript的Callback机制深入人心.而ECMAScript的世界同样充斥的各种异步操作(异步IO.setTimeout等).异步和Callback的搭载很容易就衍生"回调金字 ...

  3. ES6 之 let和const命令 Symbol Promise对象

    ECMAScript 6入门 ECMAScript 6(以下简称ES6)是JavaScript语言的下一代标准,已经在2015年6月正式发布了. (2016年6月,发布了小幅修订的<ECMASc ...

  4. 如何在外部终止一个pengding的promise对象

    今天在整理前段时间做过的项目,发现之前在集成web环信的时候遇到过一个奇怪的需求:需要终止一个正在进行等待返回的promise,或者阻止其调用resolve和reject.(具体为何会有这种需求我也不 ...

  5. es6学习笔记--promise对象

    Promise对象是为了简化异步编程.解决回调地狱情况 Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果.从语法上说,Promise 是一个对象,从它可 ...

  6. 这次聊聊Promise对象

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由前端林子发表于云+社区专栏 Promise是CommonJS提出的一种规范,在ES6中已经原生支持Promise对象,非ES6环境可以 ...

  7. Promise对象及它在js中的执行顺序

    关于Promise对象的学习及它的执行顺序 学习阮一峰老师的ES6入门后的记录 1.promise的定义 promise是一个对象,通常包裹着一个异步操作,promise对象提供一些接口的方法,返回一 ...

  8. angular学习笔记(二十八-附2)-$http,$resource中的promise对象

    下面这种promise的用法,我从第一篇$http笔记到$resource笔记中,一直都有用到: HttpREST.factory('cardResource',function($resource) ...

  9. ES6深入学习记录(二)promise对象相关

    1.Promise的含义 Promise是异步编程的一种解决方案,比传统的解决方案--回调函数和事件更合理和强大.ES6将其写进了语言标准,统一了用法,原生提供了promise对象. 所谓Promis ...

随机推荐

  1. XSSFWorkbook

    支持2007以后的 此类与HSSFWorkbook(支持2007之前) 类似,读取文件时把全部的内容都存放到内存中,关闭输入流后. 内存与硬盘完全是毫无关系的两份数据,所有的操作都是对内存的操作,最后 ...

  2. JQuery插件,轻量级表单模型验证(续 一)

    之前的代码结构,不方便扩展多结构的模型验证 重新结构设计了一下验证模型核心 var validateForm = (function(model) { model.Key = "[data- ...

  3. K短路 学习笔记

    K短路,顾名思义,是让你求从$s$到$t$的第$k$短的路. 暴力当然不可取,那么我们有什么算法可以解决这个问题? -------------------------- 首先,我们要维护一个堆. st ...

  4. 银弹谷V百科|使用技巧:Vbase技巧二则之一

    银弹谷零代码开发V平台提供访问窗体的短地址链接 格式:http://IP:port/form/componentCode/windowCode  例子: 默认地址:http://IP:port/mod ...

  5. Spring bean自定义命名策略(注解实现)

    我们都知道项目后台开发是从 控制层——业务层——mybatis层,@Controller.@Service.@Mapper...等等注解可以将对象自动加载到bean容器中,还能实现相应的功能,使用起来 ...

  6. 利用mybatis的Generator的插件生成代码

    1 在resources文件夹下创建generatorConfig.xml文件来做相关配置 <?xml version="1.0" encoding="UTF-8& ...

  7. one of the variables needed for gradient computation has been modified by an inplace operation: [torch.cuda.FloatTensor [3, 1280, 28, 28]], which is output 0 of LeakyReluBackward1, is at version 2;

    RuntimeError: one of the variables needed for gradient computation has been modified by an inplace o ...

  8. java 封装与this关键字

    一 封装 1.封装的概述 封装,它也是面向对象思想的特征之一.面向对象共有三个特征:封装,继承,多态. 封装表现: 1.方法就是一个最基本封装体. 2.类其实也是一个封装体. 从以上两点得出结论,封装 ...

  9. C#LeetCode刷题之#15-三数之和(3Sum)

    目录 问题 示例 分析 问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3618 访问. 给定一个包含 n 个整数的 ...

  10. C#LeetCode刷题-回溯算法

    回溯算法篇 # 题名 刷题 通过率 难度 10 正则表达式匹配   18.8% 困难 17 电话号码的字母组合   43.8% 中等 22 括号生成   64.9% 中等 37 解数独   45.8% ...