☆promise异步编排

javascript众所周知只能支持单线程,因此各种网络请求必须异步发送,导致可能会出现很多问题,比如如下我们有三个文件,现在要求进行如下请求:

① 查出当前用户信息

② 根据当前查出的用户id查出他的课程

③ 根据查出的课程id查出这门课的成绩

user.json

{
"id": 1,
"name": "zhangsan",
"password": "123123"
}

user_corse_1.json

{
"id": 10,
"name": "chinese"
}

corse_score_10.json

{
"id": 100,
"score": 90
}

这里就要注意了,如果依次写三个ajax请求,那么大概率是要出错的,这是由于三个请求是异步的,这样就不能保证第一个请求在第二三个请求之前返回结果,导致其他两个请求查询失败。

<script>
var result
$.ajax({
url: '/mock/user.json',
success(data) {
console.log('查询到用户信息:', data)
result = data
},
error(err) {
console.log(err)
}
})
$.ajax({
url: '/mock/user_corse_${result.id}.json',
success(data) {
console.log('查询到用户的课程信息:', data)
result = data
},
error(err) {
console.log(err)
}
})
$.ajax({
url: '/mock/corese_score_${result.id}.json',
success(data) {
console.log('查询到用户课程的成绩信息:', data)
},
error(err) {
console.log(err)
}
})
</script>

最直接解决的方法时通过嵌套,但是这样明显不够优雅

<script>
$.ajax({
url: 'mock/user.json',
success(data) {
console.log('查询到用户信息:', data)
$.ajax({
url: `mock/user_corse_${data.id}.json`,
success(data) {
console.log('查询到用户的课程信息:', data)
$.ajax({
url: `mock/corse_score_${data.id}.json`,
success(data) {
console.log('查询到用户课程的成绩信息:', data)
},
error(err) {
console.log(err)
}
})
},
error(err) {
console.log(err)
}
})
},
error(err) {
console.log(err)
}
})
</script>

这时候就轮到Es6的promise登场了,promise可以封装异步操作,让他们同步按照一定次序执行。首先创建一个promise,两个参数resolve代表成功的返回,reject代表失败的返回并终结promise链,然后不断执行p.then操作,参数为上一次resolve返回的数据。

    let p = new Promise((resolve, reject) => {
// 异步操作
$.ajax({
url: 'mock/user.json',
success(data) {
console.log('查询到用户信息:', data)
resolve(data)
},
error(err) {
reject(err)
}
})
}) p.then((obj) => {
return new Promise((resolve, reject) => {
// 异步操作
$.ajax({
url: `mock/user_corse_${obj.id}.json`,
success(data) {
console.log('查询到用户的课程信息:', data)
resolve(data)
},
error(err) {
reject(err)
}
})
})
}).then((obj) => {
return new Promise((resolve, reject) => {
// 异步操作
$.ajax({
url: `mock/corse_score_${obj.id}.json`,
success(data) {
console.log('查询到用户课程的成绩信息:', data)
resolve(data)
},
error(err) {
reject(err)
}
})
})
})

更优雅一些可以对其中的重复操作进行封装,如下:

<script>
function get(url) {
return new Promise((resolve, reject) => {
$.ajax({
url,
success(data) {
resolve(data)
},
error(err) {
reject(err)
}
})
})
}
get('mock/user.json')
.then((data) => {
console.log('查询到用户信息:', data)
return get(`mock/user_corse_${data.id}.json`)
})
.then((data) => {
console.log('查询到用户的课程信息:', data)
return get(`mock/corse_score_${data.id}.json`)
})
.then(data => {
console.log('查询到用户课程的成绩信息:', data)
})
.catch(err=>{
console.log(err)
})
</script>

【前端基础】(二)promise异步编排的更多相关文章

  1. 前端基础(二):CSS

    CSS介绍 CSS(Cascading Style Sheet,层叠样式表)定义如何显示HTML元素. 当浏览器读到一个样式表,它就会按照这个样式表来对文档进行格式化(渲染). CSS语法 CSS实例 ...

  2. Java8 异步编排类CompletableFuture

    为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处.LaplaceDemon/ShiJiaqi. https://www.cnblogs.com/shijiaqi1066/p/8758206 ...

  3. ES6学习笔记(十二)异步解决方案Promise

    1.Promise 的含义 Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大.它由社区最早提出和实现,ES6 将其写进了语言标准,统一了用法,原生提供了P ...

  4. 前端基础面试题(JS部分)

    1.几种基本数据类型?复杂数据类型?值类型和引用数据类型?堆栈数据结构? 基本数据类型:Undefined.Null.Boolean.Number.String 值类型:数值.布尔值.null.und ...

  5. BAT 前端开发面经 —— 吐血总结 前端相关片段整理——持续更新 前端基础精简总结 Web Storage You don't know js

    BAT 前端开发面经 —— 吐血总结   目录 1. Tencent 2. 阿里 3. 百度 更好阅读,请移步这里 聊之前 最近暑期实习招聘已经开始,个人目前参加了阿里的内推及腾讯和百度的实习生招聘, ...

  6. ES6入门八:Promise异步编程与模拟实现源码

    Promise的基本使用入门: ——实例化promise对象与注册回调 ——宏任务与微任务的执行顺序 ——then方法的链式调用与抛出错误(throw new Error) ——链式调用的返回值与传值 ...

  7. 前端基础面试题(js部分)

      前端基础面试题(JS部分)   1.几种基本数据类型?复杂数据类型?值类型和引用数据类型?堆栈数据结构? 基本数据类型:Undefined.Null.Boolean.Number.String值类 ...

  8. ES6笔记(7)-- Promise异步编程

    系列文章 -- ES6笔记系列 很久很久以前,在做Node.js聊天室,使用MongoDB数据服务的时候就遇到了多重回调嵌套导致代码混乱的问题. JS异步编程有利有弊,Promise的出现,改善了这一 ...

  9. web前端基础知识及快速入门指南

    web前端基础知识及快速入门指南 做前端开发有几个月了,虽然说是几个月,但是中间断断续续的上课.考试以及其它杂七杂八的事情,到现在居然一直感觉自己虽然很多前端的知识很眼熟,却也感觉自己貌似也知识在门口 ...

  10. html css 前端基础 学习方法及经验分享

    前言: 入园第一天,想分享一点儿前端基础html css 的学习方法和一些经验给热爱前端,但是不知道从哪儿开始,依旧有些迷茫的新手朋友们.当然,适合每个人的学习方式不同,以下所讲的仅供参考. 一.关于 ...

随机推荐

  1. VUE keepAlive缓存问题之动态使用exclude(会使用到VUEX)

    exclude是啥? 官方解释: 怎么用呢? 处理的问题是什么?(答:返回首页的时候清除B页面的缓存) 我遇到的问题是: 一开始状态:A(首页). B(列表).C(列表中的详情)三个页面,设置B页面的 ...

  2. 06 HBase安装与伪分布式配置

    1.下载压缩文件 2.解压 3.修改文件夹名 4.修改文件夹权限 5.配置环境变量 6.伪分布式配置文件 7.启动HDFS,启动Hbase 8.进入shell界面 9.停止Hbase,停止HDFS运行

  3. 图模导入原理之 SVG图形基础与图形导入

    一.svg图形基础 PMS图形中,图形svg文件内容一般由两部分组成: 1.<defs>标签中定义的是图元信息,即各种不同设备不同状态的图元应该如何显示: 2.各种<XXXXXX_L ...

  4. Python之简单文件操作

    文件操作,open() 1 # open(file_path, mode='r', encoding='utf-8') 2 # file_path 目标文件路径 3 # mode 文件模式,参数r-读 ...

  5. white-space: pre-line;的坑

    html模版解析换行 这是字符串 跟标签设置white-space: pre-line: pre兼容ie8,pre-line不兼容ie 6-7 这行文字开头是没有空格的但是还是有很大的空格,代码方法截 ...

  6. mysql使用support-files下的mysql.server启动报错“Starting MySQL ERROR! Couldn't find MySQL server (/usr/local/mysql/bin/mysqld_safe)”

    报错版本:mysql-5.7.35 1.报错完整提示信息: [root@localhost support-files]# ./mysql.server start ./mysql.server: l ...

  7. [picoCTF]Insp3ct0r write up

    根据提示,需要检查浏览器上的Web代码(动手翻译一下啦) (漫不经心的瞅瞅页面,curl+UUUUUUU(一只U就行)一下下,微微瞄一瞄,where is flag? fn+f12(或其它)打开源代码 ...

  8. WEB/H5测试标准

  9. Linux高并发服务器之Linux多线程开发

    本文源自C++高薪面试项目的学习笔记,主要记录Liunx多线程的学习,主要知识点是线程概述等基础概念以外,还有线程相关Liunx系统函数以及对应练手代码,除此之外还有线程同步问题的讲解以及实战多线程买 ...

  10. Matlab笔记--Matlab概述(初登场)

    Matlab概述 安装MATLAB教程 可以参考这里:https://www.cnblogs.com/sixuwuxian/p/15858196.html Matlab的启动 右键图标,选择属性,可以 ...