基本用法

关于Promise的资料,网上有很多了,这里简单粗暴一点,直接上代码。

假设我们要做一个访问后端API的函数,那么我们可以这样模拟一下。

    const mySend = (url, data) => {
// 接收url 和data,假装向后端提交
console.log('url:', url, data)
// 定义一个实例
const p = new Promise((resolve, reject)=>{
// resolve,reject是形式参数,可以是任意写法,如(res, rej)
// 默认第一个参数实现的是resolve功能;
// 第二个参数实现的是reject功能。
console.log("假装访问了一下后端,并且获得了数据。")
const data = {
name: 'jyk',
time: new Date().valueOf()
}
// 成功了,返回给调用者
resolve(data)
// 不同于return, resolve()执行完成后后面的代码还会执行。
console.log('resolve后的代码')
// 如果 resolve 被调用了,那么 reject 就不会被调用了。
// 失败的话,调用reject返回给调用者。
reject('失败了')
})
return p
}
  • new Promise

    先定义一个函数,用于接收调用者的参数。

    然后生成一个Promise的实例,在里面进行我们想要的操作。

  • resolve(data)

    如果操作成功就调用 resolve(data) ,返回给调用者;

  • reject('失败了')

    如果操作失败,就调用reject('失败了') ,返回给调用者。

注意:返回参数只能有一个,不支持多个参数,如果需要返回多个,可以组成一个对象。

有些例子会用setTimeout做演示,其实效果都一样,不是必须弄个异步的方式来模拟。

单次调用

函数写好了,怎么调用呢?其实调用方法和axios的使用方式很像,因为axios也是用promis封装的。

  const submit = () => {
mySend('/api/person', {id: 122})
.then((data) => {
console.log('回调数据:', data)
})
.catch((error) => {
console.log(error)
})
}

调用很简单,看着也非常眼熟对吧。

  • then 响应成功的回调,

  • catch 响应失败(异常)的回调。

  • 运行结果:

url-data: /api/person {id: 122}
(index):32 假装访问了一下后端,并且获得了数据。
(index):39 resolve后的代码
(index):52 回调数据: {name: "jyk", time: 1612084395672}

依次调用

如果要多次调用呢?而且要得到上一次返回的数据,才能发起下一次的访问。

  const submitStep = () => {
mySend('/api/person1', [1,2,3]).then((data) => {
console.log('第一个返回:', data)
return mySend('/api/person2', data) // 发起第二次请求
}).then((data) => {
console.log('第二个返回:', data)
return mySend('/api/person3', data) // 发起第三次请求
}).then((data) => {
console.log('第三个返回:', data)
return mySend('/api/person4', data) // 发起第四次请求
}).then((data) => {
console.log('第四个返回:', data)
})
}

第一次调用的回调函数里面,使用return的方式,发起下一次调用。这样就可以避免回调地域。

  • 运行结果:
url-data: /api/person1 (3) [1, 2, 3]
(index):32 假装访问了一下后端,并且获得了数据。
(index):39 resolve后的代码
(index):62 第一个返回: {name: "jyk", time: 1612084751425}
(index):26 url-data: /api/person2 {name: "jyk", time: 1612084751425}
(index):32 假装访问了一下后端,并且获得了数据。
(index):39 resolve后的代码
(index):65 第二个返回: {name: "jyk", time: 1612084751426}
(index):26 url-data: /api/person3 {name: "jyk", time: 1612084751426}
(index):32 假装访问了一下后端,并且获得了数据。
(index):39 resolve后的代码
(index):68 第三个返回: {name: "jyk", time: 1612084751428}
(index):26 url-data: /api/person4 {name: "jyk", time: 1612084751428}
(index):32 假装访问了一下后端,并且获得了数据。
(index):39 resolve后的代码
(index):71 第四个返回: {name: "jyk", time: 1612084751430}

可以注意一下time的值,前后是对应的。

批量调用

如果下次调用不需要上一次的结果呢?那么能不能一起调用呢?当然是可以的。

    const submitMore = () => {
Promise.all([
mySend('/api/person11', [1,2,3]),
mySend('/api/person22', [4,5,6]),
mySend('/api/person33', [7,8,9])
]).then((data) => {
console.log("一起调用,一起返回:")
console.log('data:', data)
console.log('data11:', data[0])
console.log('data22:', data[1])
console.log('data33:', data[2])
},(msg) => {
console.log(msg)
})
}
  • Promise.all

    使用 Promise.all,把调用写成数组的形式。

    返回的data也是一个数组的形式,其顺序会对照上面的调用顺序。

  • 运行结果:

url-data: /api/person11 (3) [1, 2, 3]
(index):32 假装访问了一下后端,并且获得了数据。
(index):39 resolve后的代码
(index):26 url-data: /api/person22 (3) [4, 5, 6]
(index):32 假装访问了一下后端,并且获得了数据。
(index):39 resolve后的代码
(index):26 url-data: /api/person33 (3) [7, 8, 9]
(index):32 假装访问了一下后端,并且获得了数据。
(index):39 resolve后的代码
(index):82 一起调用,一起返回:
(index):83 data: (3) [{…}, {…}, {…}]
0: {name: "jyk", time: 1612085029968}
1: {name: "jyk", time: 1612085029969}
2: {name: "jyk", time: 1612085029970}
length: 3__proto__: Array(0)
(index):84 data11: {name: "jyk", time: 1612085029968}
(index):85 data22: {name: "jyk", time: 1612085029969}
(index):86 data33: {name: "jyk", time: 1612085029970}

可以看到,先发起了申请,然后结果会一起返回。

小结

这样看起来就不会晕了吧。我的想法是,先会用能够运行起来,以后有空了在去研究原理和其他细节。

在线演示:https://naturefwvue.github.io/nf-vue-cnd/ES6/promise/

源码:https://github.com/naturefwvue/nf-vue-cnd/tree/main/ES6/promise

ES6(三) Promise 的基本使用方式的更多相关文章

  1. ES6的promise对象研究

    ES6的promise对象研究 什么叫promise? Promise对象可以理解为一次执行的异步操作,使用promise对象之后可以使用一种链式调用的方式来组织代码:让代码更加的直观. 那我们为什么 ...

  2. ES6之Promise用法详解

    一 前言 本文主要对ES6的Promise进行一些入门级的介绍.要想学习一个知识点,肯定是从三个方面出发,what.why.how.下面就跟着我一步步学习吧~ 二 什么是Promise 首先是what ...

  3. ES6中promise总结

    一.什么是ES6的Promise 讲太多也没有.直接在打印出来就好,console.dir(Promise) Promise 是一个构造函数,自身有all, reject, resolve 这几个眼熟 ...

  4. ES6新增"Promise"可避免回调地狱

    Promise是一个构造函数,自己身上有all.reject.resolve这几个眼熟的方法,原型上有then.catch等同样很眼熟的方法. 那就new一个 var p = new Promise( ...

  5. 关于ES6的Promise的使用深入理解

    ES6的promise对象研究 什么叫promise? Promise对象可以理解为一次执行的异步操作,使用promise对象之后可以使用一种链式调用的方式来组织代码:让代码更加的直观. 那我们为什么 ...

  6. 教你如何使用ES6的Promise对象

    教你如何使用ES6的Promise对象 Promise对象,ES6新增的一个全新特性,这个是 ES6中非常重要的一个对象 Promise的设计初衷 首先,我们先一起了解一下,为什么要设计出这么一个玩意 ...

  7. 深入理解JS异步编程三(promise)

    jQuery 原本写一个小动画我们可能是这样的 $('.animateEle').animate({ opacity:'.5' }, 4000,function(){ $('.animateEle2' ...

  8. 浅谈ES6原生Promise

    浅谈ES6原生Promise 转载 作者:samchowgo 链接:https://segmentfault.com/a/1190000006708151 ES6标准出炉之前,一个幽灵,回调的幽灵,游 ...

  9. 解读Es6之 promise

            单线程:  在同一时间只能有同一任务进行.JavaScript就是一门单线程语言                 当有多个任务需要进行时,则需要进行排队,前一个执行完毕才能执行下一个; ...

随机推荐

  1. EF Core CodeFirst数据库自动迁移

    开发过程中都会遇到数据库数据结构更新的问题,怎么对数据库更新进行版本控制呢? 不同的项目对数据库版本更新控制的方式不同,常用的有第三方Evolve,开发人员将数据库更新脚本按照版本号的放在一起,然后执 ...

  2. CentOS7 普通用户绕过root登录

      正常环境中我们的服务器都会使用一个普通用户跳转到root进行操作,如果root用户的密码不记得只知道普通用户密码,设备又不方便进行开关机破密码时,我们就可以用到以下方法登陆设备. pkexec : ...

  3. JavaScript高级程序设计(第4版)知识点总结

    介绍 JavaScript高级程序设计 第四版,在第三版的基础上添加了ES6相关的内容.如let.const关键字,Fetch API.工作者线程.模块.Promise 等.适合具有一定编程经验的 W ...

  4. keycloak集成微信登陆~解决国内微信集成的问题

    之前看了国内写的微信集成keycloak的文章,然后拿来就用了,但我的是jboss部署的keycloak,然后使用他的包之后,会出现类无法找到的问题,之后找了很多资料,多数都是国外的,在今天终于找到了 ...

  5. Jenkins+GitLab+SonnarQube搭建CI/CD全流程

    1. CI/CD 1.1 CI - 持续集成 持续集成( Continuous integration , 简称 CI )指的是,频繁地(一天多次)将代码集成到主干.持续集成的目的就是让产品可以快速迭 ...

  6. 【C++】《Effective C++》第三章

    第三章 资源管理 条款13:以对象管理资源 当申请一块动态内存时,可能会发生内存泄漏. class Investment {}; void f() { Investment* pInv = creat ...

  7. 关于maven多module的依赖问题

    之前的项目因为历史的原因,都是一个project里只包含了一个module,今年进入了新的项目组,出现了多个module,最近刚好也是在学<maven实战>因此想要将这个东西记录下来 工程 ...

  8. Jenkins+windows+.netcore+git+iis自动化部署入门

    什么是自动化部署,就不介绍了,喜欢直接进入主题. 一. 所需环境: 1.系统为windows10 . 2.asp.net core3.1 runtime必须安装,因为我的代码是asp.net core ...

  9. 【Linux】Linux下如何分区及如何格式化

    环境:CentOS7.1 磁盘大小是1.8T 将磁盘/dev/sda分一个分区,分区类型为xfs fdisk /dev/sda n    --创建新分区 p  --创建分区类型为主分区 1  --主分 ...

  10. 为什么会有 AtomicReference ?

    我把自己以往的文章汇总成为了 Github ,欢迎各位大佬 star https://github.com/crisxuan/bestJavaer 我们之前了解过了 AtomicInteger.Ato ...