简单认识Promise
什么是Promise
Promise是异步编程的一个解决方案:从语法上讲它是一个对象,可以获取到异步操作的消息,从本意上讲,它是一个承诺,承诺过一段时间后它会给你一个结果。Promise有三种状态:pending(等待),fulfilled(成功),rejected(失败),状态一旦改变就不会再变,创建Promise后会立即执行。
为什么要使用Promise
避免回调地狱
// 请求 代表 一个异步网络调用。
// 请求结果 代表网络请求的响应。
请求1(function(请求结果1){
请求2(function(请求结果2){
请求3(function(请求结果3){
请求4(function(请求结果4){
请求5(function(请求结果5){
请求6(function(请求结果3){
...
})
})
})
})
})
})
解决办法
new Promise(请求1)
.then(请求2(请求结果1))
.then(请求3(请求结果2))
.then(请求4(请求结果3))
.then(请求5(请求结果4))
.catch(处理异常(异常信息))
Promise 的常用 API
Promise.resolve(value)
类方法,该方法返回一个以 value 值解析后的 Promise 对象
1、如果这个值是个 thenable(即带有 then 方法),返回的 Promise 对象会“跟随”这个 thenable 的对象,采用它的最终状态(指fulfilled/rejected/pending)
2、如果传入的 value 本身就是 Promise 对象,则该对象作为 Promise.resolve 方法的返回值返回。
3、其他情况以该值为成功状态返回一个 Promise 对象。
let p0=Promise.resolve('success');
p0.then(
res=>{
console.log(res);
},
err=>{
console.log(err);
}
)
// success
// 和p1效果相同
let p1=new Promise((resolve,reject)=>{
resolve('success')
})
p1.then(
res=>{
console.log(res);
},
err=>{
console.log(err);
}
)
// success
//如果传入的 value 本身就是 Promise 对象,则该对象作为 Promise.resolve 方法的返回值返回。
function fn(resolve){
setTimeout(function(){
resolve(123);
},3000);
}
let p2 = new Promise(fn);
let p3 = Promise.resolve(p2);
// 返回为true,返回的 Promise 即是 入参的 Promise 对象。
console.log(p2 === p3);
// true
Promise.reject
类方法,且与 resolve 唯一的不同是,返回的 promise 对象的状态为 rejected。
Promise.prototype.then
实例方法,为 Promise 注册回调函数,函数形式:fn(vlaue){},value 是上一个任务的返回结果,then 中的函数一定要 return 一个结果或者一个新的 Promise 对象,才可以让之后的then 回调接收。
Promise.prototype.catch
实例方法,捕获异常,函数形式:fn(err){}, err 是 catch 注册 之前的回调抛出的异常信息。
let p=Promise.resolve('0 success');
p.then(
res=>{
console.log(res);
return '1 success'
}
)
.then(res=>{
console.log(res);
throw new Error('2 error')
})
.catch(err=>{
console.log('catch',err);
})
// 0 success
// 1 success
// catch Error: 2 error
catch方法可以统一捕获then链式调用中产生的错误
Promise.finally
实例方法,用于指定不管Promise对象最后状态如何,都会执行的操作,不管Promise最后的状态,在执行完then或者catch指定的回调以后都会执行finally方法。可以进行任何必要的清理工作
let p=Promise.resolve('0 success');
p.then(
res=>{
console.log(res);
return '1 success'
}
)
.then(res=>{
console.log(res);
throw new Error('2 error')
})
.catch(err=>{
console.log('catch',err);
})
.finally(()=>{
console.log('p finally');
})
// 0 success
// 1 success
// catch Error: 2 error
// p finally
Promise.all([...])
类方法,多个 Promise 任务同时执行,返回最先执行结束的 Promise 任务的结果,不管这个 Promise 结果是成功还是失败。 。
let p1 = Promise.resolve('p1 success');
let p2 = Promise.resolve('p2 success');
let p3 = Promise.reject('p3 error')
let arr = [p1, p2, p3]
Promise.all(arr)
.then(
res => {
console.log(res);
},
err => {
console.log(err);
}
)
// p3 error
Promise.race([...])
类方法,多个 Promise 任务同时执行,返回最先执行结束的 Promise 任务的结果,不管这个 Promise 结果是成功还是失败。
let p1 = Promise.resolve('p1 success');
let p2 = Promise.resolve('p2 success');
let p3 = Promise.reject('p3 error')
let arr = [p1, p2, p3]
Promise.race(arr)
.then(
res => {
console.log(res);
},
err => {
console.log(err);
}
)
// p1 success
Promise.any([...])
与all相似,但是会忽略拒绝,所以只需要完成一个而不是全部
let p1 = Promise.reject('p1 error');
let p2 = Promise.resolve('p2 success');
let p3 = Promise.reject('p3 error')
let arr = [p1, p2, p3]
Promise.any(arr)
.then(
res => {
console.log(res);
},
err => {
console.log(err);
}
)
// p2 success
变式
Promise.none([...])
类似于all不过完成和拒绝的情况互换,只有所有的函数都被拒绝,该函数转化为完成值,反之亦然
Promise.first([...])
类似于any的竞争,只要第一个Promise完成,会忽略后边任何的拒绝和完成
Promise.last([...])
类似于first,但是只有最后一个完成胜出
简单认识Promise的更多相关文章
- 一个简单的Promise 实现
用了这么长时间的promise,也看了很多关于promise 的文章博客,对promise 算是些了解.但是要更深的理解promise,最好的办法还是自己实现一个. 我大概清楚promise 是对异步 ...
- 实现简单的promise
只考虑成功时的调用,方便理解一下promise的原理promise的例子: 1. 接下来一步步实现一个简单的promise step1:promise 接受一个函数作为构造函数的参数,是立即执行的,并 ...
- 如何用原生JS实现一个简单的promise
我又又又回来了,最近真是累的跟狗一样,急需一个大保健回复一下子精力 我现在是一边喝着红牛一边写着博客,好了好了,不扯了,回归整体好吧 先简单来说一下啥是promise吧 它是什么?Promise是一个 ...
- 简单版 Promise/A+,通过官方872个测试用例
promise 标准 在实现 Promise 之前要清楚的是 JavaScript 中的 Promise 遵循了 Promises/A+ 规范,所以我们在编写 Promise 时也应当遵循这个规范,建 ...
- 聊一聊看似简单的Promise.prototype.then()方法
Promise.prototype.then() Proise实例的then方法是定义在原型对象Promise.prototype上的,它的作用是为Promise实例添加状态改变时的回调函数. 该方法 ...
- 简单模拟 Promise
class promise { constructor(fn) { this.data = null; this.err = null; this.isPromise = false; this.er ...
- [手写系列] 带你实现一个简单的Promise
简介 学习之前 需要先对Promise有个基本了解哦,这里都默认大家都是比较熟悉Promise的 本次将带小伙伴们实现Promise的基本功能 Promise的基本骨架 Promise的then Pr ...
- 简单的 Promise 实现
参考 http://www.tuicool.com/articles/RzQRV3 var PENDING = undefined, FULLFILLED = 1, REJECTED = 2; var ...
- 简单的 Promise 实现 一
const Promise = function(fn){ let state = { pending: "pending", fulfilled: "fulfilled ...
- 手写简单的promise
function Promise(fn) { var that = this; this.status = "pedding"; this.value = undefined; / ...
随机推荐
- LeeCode 433 最小基因变化
LeeCode 433 最小基因变化 题目描述: 基因序列可以表示为一条由 8 个字符组成的字符串,其中每个字符都是 'A'.'C'.'G' 和 'T' 之一. 假设我们需要调查从基因序列 start ...
- 解Bug之路-应用999线升高
前言 监控指标诚然是发现问题于微末之时的极佳手段,但指标往往有其表达的极限.在很多情况下,单独看一个黄金指标并不能表征系统的健康程度,反而有可能被其迷惑,进而忽略相关问题.(本文所提及的Linux K ...
- pandas小技巧
1. 删除列 import pandas as pd df.drop("Unnamed: 0", axis=1, inplace=True) 2. 转换列的格式 df[" ...
- JS执行机制--同步与异步
单线程JavaScript语言具有单线程的特点,同一个时间只能做一件事情.这是因为JavaScript脚本语言是为了处理页面中用户的交互,以及操作DOM而诞生的.如果对某个DOM元素进行添加和删除,不 ...
- 【原型设计模式详解】C/Java/JS/Go/Python/TS不同语言实现
简介 原型模式(Prototype Pattern)是一种创建型设计模式,使你能够复制已有对象,而无需使代码依赖它们所属的类,同时又能保证性能. 这种模式是实现了一个原型接口,该接口用于创建当前对象的 ...
- Docker高级
一.Docker安装企业级开发应用 1.Docker搭建MySQL主从 (1) 创建master主机MySQL docker run -p 3307:3306 --name mysql-master ...
- 如何利用Requestly提升前端开发与测试的效率,让你事半功倍?
痛点 前端测试 在进行前端页面开发或者测试的时候,我们会遇到这一类场景: 在开发阶段,前端想通过调用真实的接口返回响应 在开发或者生产阶段需要验证前端页面的一些 异常场景 或者 临界值 时 在测试阶段 ...
- 音视频八股文(11)-- ffmpeg avio 内存输入和内存输出。内存输出有完整代码,网上很少有的。
1.avio介绍 avio是FFmpeg中的一个模块,用于实现多种输入输出方式的封装. avio提供了一系列API,可以将数据从内存读取到缓冲区中,也可以将缓冲区中的数据写入到内存中.其实现依赖于IO ...
- 我做了一个 VSCode 插件版的 ChatGPT
大家好,我是风筝 其实很早之前就想学学 VSCode 插件开发了,但是又不知道做什么,加上我这半吊子前端水平,迟迟没有动手. 最近 ChatGPT 火的一塌糊涂,我也一直在用,真的非常好用,有些问题之 ...
- Pillow模块——生成随机验证码
urls.py path('get_code/',views.get_code), views.py中 from PIL import Image,ImageFont,ImageDraw " ...