一、什么是promise?

什么是promise呢?MDN上是这样解释的:Promise是一个对象,他代表了一个异步操作的最终完成或者失败。本质上Promise是一个函数返回的对象,我们可以在它上面绑定回调函数,这样我们就不需要一开始把回调函数作为参数传入这个函数了

实际上Promise与现实生活中的承诺非常相似。

在现实生活中呢,我们通常是这样理解Promise的:承诺(保证)某人会做某事或者某事的发生。也就是要给将来多要发生的事一
个承诺,但是谁都不能保证这件事一定会能够按照理想状态发生。

二、创建Promise

好了,下面我们来看一个如何创建promise.
Promise是浏览器自带的(但不是所有浏览器都支持promise)

有三种办法创建Promise实例(对象)
(1). 构造方法

let promise1 = new Promise((resolve,reject)=>{resolve();
});
console.log(promise1);

(2).通过Promise实例的方法,Promise.then方法返回的也是一个promise对象

promise.then(onFulfilled, onRejected);

(3). 通过Promise的静态方法,Promise.resolve(),Promise.reject()

const promise2 = Promise.resolve();
promise3.then(function(value){console.log(value);
});

从上面的代码可以看出,即便在业务逻辑上是层层嵌套,但是代码写法上,却十分优雅,也没有过多的嵌套。

三、 Promise 的作用

JavaScript可以用回调函数处理异步操作,原因就是Promise是一种强大的异步处理方式,而且它有统一的API和规范,Promise对象可以用同步的表现形式来书写异步代码(也就是说代码看起来是同步的,但本质上的运行过程是异步的)下面通过一个例子来看一下传统处理异步操作和Promise处理异步操作有哪些不同。

使用回调函数处理异步操作

var doSomething = function A(todo,callback){setTimeout(function(){console.log(todo);callback();},1000);
}
doSomething("起床",function(){doSomething("刷牙",function(){doSomething("吃早饭",function(){console.log("上学");});});
});//起床
//刷牙
//吃早饭
//上学

这样看起来代码非常冗余,并且读起来也很复杂,不利于后期维护

使用Promise处理异步操作

const myPromise = new Promise((resolve,reject)=>{setTimeout(()=>{resolve('foo');},1000);
});
myPromise.then(function(){console.log("起床");}).then(function(){console.log("刷牙");}).then(function(){console.log("吃早饭");}).then(function(){console.log("上学");})//起床
//刷牙
//吃早饭
//上学

四、 Promise的三种状态

一个Promise 必然处于以下几种状态之一:

  • 待处理(pending) :初始状态,既没有兑现 ,也没有被拒绝。
  • 已兑现(fulfilled) :意味着操作成功完成。
  • 已拒绝(rejected): 意味着操作失败。

PromiseState:就是promise的现在状态。
PromiseResult:就是resolve或者reject返回的结果

1、创建promise实例

//创建promise实例
let promise = new Promise((resolve,reject) => {console.log(11);
});
console.log(promise);


当new Promise()(创建promise实例)执行之后,Promise对象的状态会被初始化为pending

2、当你调用resolve时,状态立马变成了fulfilled(成功状态)

let promise = new Promise((resolve,reject) => {resolve();console.log(11);
});
console.log(promise);

3、当调用reject时,状态就变成了rejected(失败状态)

4、如果两个状态都存在,那么谁先调用谁为准

5、PromiseResult为resolve或者reject返回的结果

function clg(){return '我就是返回的结果'
}
let promise = new Promise((resolve,reject) => {resolve(clg());
});console.log(promise);// Promise {<fulfilled>: '我就是返回的结果'}
// [[Prototype]]: Promise
// [[PromiseState]]: "fulfilled"
// [[PromiseResult]]: "我就是返回的结果"

五、Promise的实例方法

new Promise是同步的
通过上面的打印我们可以看到Promise.prototype上有以下几种实例方法,下满我们来研究一下这些方法都有什么作用,并且如何使用

1、Promise.prototype.then()

MDN上这样解释:then( ) 方法返回一个Promise。它最多需要有两个参数:promise的成功和失败情况的回调函数。
resolve或者reject返回的结果实际上是返回给then的,then函数里的参数是两个异步回调函数,第一个参数接收esolve返回的数据,第二个函数参数接收reject返回的数据

1.1、接收resolve返回的数据

const promise1 = new Promise((resolve,reject) =>{resolve('Success!');
});
promise1.then((value) => {console.log(value);
});

1.2、接收reject返回的数据

const p = new Promise((resolve,reject) =>{// resolve('Success!');reject('failed!');
});
p.then((value) => {console.log(value);},(err) => {console.log(err);});
console.log(p);

1.3、缺失某个状态或参数非函数

在then()方法中,如果忽略了某一个状态的回调函数,或者填写一个其他不是函数的参数,那么then方法将不会返回缺失该状态的回调函数信息,但是并不会产生错误


此时状态也变为pending(待定状态)。

返回值

下面我们来看两个例子

1、不添加return

2、添加return


很明显我们能够看到二者的差别

  • 返回了一个值,那么then返回的Promise将会变为成功状态,并且将返回的值,作为成功状态的回调函数的参数值
  • 没有返回值,那么then方法返回的Promise因为变为成功状态,但是该成功状态的回调函数的参数值为underfined。
  • 同时new Promise 是同步的。promise如果没有使用resolve或reject更改状态时,状态为pending,当完成异步任务之后,状态分为成功或失败,此时我们就可以用resolve()和reject(),同时状态做出相应的改变

六、Promise封装异步任务

传统写法

// 定义一个异步的延迟函数:异步函数结束1秒之后,再执行cb回调函数
function fun1(cb) {setTimeout(function () {console.log('即将执行cb回调函数');cb();}, 1000);
}// 先执行异步函数 fun1,再执行回调函数 myCallback
fun1(myCallback);// 定义回调函数
function myCallback() {console.log('我是延迟执行的cb回调函数');
}

传统写法的化简版

function fun1(cb){setTimeout(cb,1000);
}
fun1(function () {console.log('我是延迟执行的cb回调函数');
})

Promise写法

function myPromise() {return new Promise((resolve) => {setTimeout(() => {resolve();}, 1000);});
}// 先执行异步函数 myPromise,再执行回调函数
myPromise().then(() => {console.log('我是延迟执行的回调函数');
});

JavaScript——promise(一)基础篇相关推荐

  1. 函数闭包--JavaScript权威指南--基础篇4

    函数JavaScript权威指南–基础篇4 一.知识点–函数–闭包 1.要理解函数闭包,要先知道几个概念: ①块级作用域和函数作用域的概念 FAQ:什么是块级作用域? 在类C语言中是这么定义的:变量的 ...

  2. 剖析 Promise 之基础篇

    随着浏览器端异步操作复杂程度的日益增加,以及以 Evented I/O 为核心思想的 NodeJS 的持续火爆,Promise.Async 等异步操作封装由于解决了异步编程上面临的诸多挑战,得到了越来 ...

  3. 用JavaScript简单编程——基础篇

    课堂基础学习,习题练习: 1,羽毛球拍15元,球3元,水2元.200元每种至少一个,有多少可能? let bird_num=15; let ball=3; let water=2; let s=0; ...

  4. JavaScript 学习笔记——基础篇(3)--数组

    数组:存储一组数据 数组的创建: 通过构造函数创建: var myarry = new Array() ;//创建一个空数组 注意:Array()  传参可以为多类型,若参数只有一个数值型数值n,则表 ...

  5. ASP.NET Google Maps Javascript API V3 实战基础篇一获取和设置事件处理程序中的属性...

    ASP.NET Google Maps Javascript API V3 实战基础篇一获取和设置事件处理程序中的属性 <%@ Page Language="C#" Auto ...

  6. ASP.NET Google Maps Javascript API V3 实战基础篇一检测用户位置

    ASP.NET Google Maps Javascript API V3 实战基础篇一检测用户位置 对于一些基本的东西,google maps JavaScript api v3 文档已经讲解得足够 ...

  7. Google Map 开发笔记——基础篇(Javascript )

    Google Map 开发笔记--基础篇 说明: 一.使用入门: 1.在您需要显示地图的 html 页面嵌入这段 script 2.地图 DOM 元素 3.初始化地图 二.地图画点.线.面 1.标记( ...

  8. ArcGIS API for JavaScript之基础篇(二)

    ArcGIS API for JavaScript之基础篇(二) 上一篇文章介绍了Map MapView SceneView的基本知识以及简单的demo.最近几天学习了WebMap WebScene ...

  9. web前端知识集合——javascript基础篇之javascript背景历史和运行环境(一)

    前言:温故而知新,可以为长也!万变不离其宗,无论是现在web前端技术衍生出多么优秀,好用的框架,插件,都离不开这门语言的基础知识.掌握各种优秀的框架,插件,只是"善用工具的人",深 ...

  10. JavaScript基础知识总结(基础篇)

    目录 JavaScript基础知识点总结(基础篇) 一.JavcScript基础语法应用 1.1三条输出语句 1.2JS中的数据类型 1.3JS中的强制类型转换 1.31string强制类型转换分为两 ...

最新文章

  1. (转载)Android游戏开发之旅一 长按Button原理
  2. python 编码文件json.loads json.dumps
  3. 从零写一个编译器(七):语义分析之符号表的数据结构
  4. VUE:解决判断网页端与手机端情况下,横竖屏无法判断的问题
  5. matlab散点图与colorbar,MATLAB如何为图像做colorbar
  6. dp----最少硬币问题
  7. Java之品优购课程讲义_day08(7)
  8. 龙芯的JDK非常慢,准备分析一下
  9. 【CAD】DWF文件格式详细说明,清晰易懂
  10. 【札记】二 先天八卦与后天八卦
  11. Web2.0是什么:下一代软件的业务模式与设计模式
  12. 使用Java程序接口备份数据库的思路与实现
  13. 还在搞三层架构?了解下 DDD 分层架构的三种模式吧
  14. 路由器设备选型参照天梯
  15. def read()
  16. Stata面板:Granger-因果检验
  17. android 4.4 flac,如何在Android中将音频原始转换为FLAC
  18. 一本读懂BERT(实践篇)
  19. 计算机顶级会议培训,计算机视觉顶级会议ICCV 2017 腾讯优图入选12篇论文
  20. t分布 u分布 卡方分布_重要抽样分布:卡方分布(χ2分布)、t分布和F分布

热门文章

  1. 采用串口中断方式实现串口通信:停止/持续发送“hello windows!”
  2. 项目打包公共模块失败【error:repackage failed: Unable to find main class】
  3. 百兆以太网传输距离_无法超越的100米 网线传输距离_网络设备评论-中关村在线...
  4. 玖玖精品软件下载基地,当前最棒的软件基地
  5. 太极root权限_太极app下载-太极(免root)最新版本下载安装v5.7.0
  6. 30-【什么叫规矩 什么叫体统】deque容器
  7. 全链路总结!推荐算法召回-粗排-精排
  8. 芯片中常见的DPC陶瓷基板材料有哪些?
  9. CorelDRAW Graphics Suite 2023新功能介绍
  10. javaweb城市智能公交线路查询系统ssh