【前端基础】(二)promise异步编排
☆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异步编排的更多相关文章
- 前端基础(二):CSS
CSS介绍 CSS(Cascading Style Sheet,层叠样式表)定义如何显示HTML元素. 当浏览器读到一个样式表,它就会按照这个样式表来对文档进行格式化(渲染). CSS语法 CSS实例 ...
- Java8 异步编排类CompletableFuture
为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处.LaplaceDemon/ShiJiaqi. https://www.cnblogs.com/shijiaqi1066/p/8758206 ...
- ES6学习笔记(十二)异步解决方案Promise
1.Promise 的含义 Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大.它由社区最早提出和实现,ES6 将其写进了语言标准,统一了用法,原生提供了P ...
- 前端基础面试题(JS部分)
1.几种基本数据类型?复杂数据类型?值类型和引用数据类型?堆栈数据结构? 基本数据类型:Undefined.Null.Boolean.Number.String 值类型:数值.布尔值.null.und ...
- BAT 前端开发面经 —— 吐血总结 前端相关片段整理——持续更新 前端基础精简总结 Web Storage You don't know js
BAT 前端开发面经 —— 吐血总结 目录 1. Tencent 2. 阿里 3. 百度 更好阅读,请移步这里 聊之前 最近暑期实习招聘已经开始,个人目前参加了阿里的内推及腾讯和百度的实习生招聘, ...
- ES6入门八:Promise异步编程与模拟实现源码
Promise的基本使用入门: ——实例化promise对象与注册回调 ——宏任务与微任务的执行顺序 ——then方法的链式调用与抛出错误(throw new Error) ——链式调用的返回值与传值 ...
- 前端基础面试题(js部分)
前端基础面试题(JS部分) 1.几种基本数据类型?复杂数据类型?值类型和引用数据类型?堆栈数据结构? 基本数据类型:Undefined.Null.Boolean.Number.String值类 ...
- ES6笔记(7)-- Promise异步编程
系列文章 -- ES6笔记系列 很久很久以前,在做Node.js聊天室,使用MongoDB数据服务的时候就遇到了多重回调嵌套导致代码混乱的问题. JS异步编程有利有弊,Promise的出现,改善了这一 ...
- web前端基础知识及快速入门指南
web前端基础知识及快速入门指南 做前端开发有几个月了,虽然说是几个月,但是中间断断续续的上课.考试以及其它杂七杂八的事情,到现在居然一直感觉自己虽然很多前端的知识很眼熟,却也感觉自己貌似也知识在门口 ...
- html css 前端基础 学习方法及经验分享
前言: 入园第一天,想分享一点儿前端基础html css 的学习方法和一些经验给热爱前端,但是不知道从哪儿开始,依旧有些迷茫的新手朋友们.当然,适合每个人的学习方式不同,以下所讲的仅供参考. 一.关于 ...
随机推荐
- C语言中的循环
1我觉得循环就是程序一直重复的执行一些语句,直到当符合条件时停止.循环总体分为while循环,do while循环和for循环. 2while循环和do while循环的区别:while是先判定是否符 ...
- Vue+SSM+Element-Ui实现前后端分离(1)
前言:最近学习vue,就突发奇想,小菜鸟的我是时候锻炼锻炼自己.闲话不说,整起 <-_-> 整体规划:先搭建前端,接下来后端,最后整合. 一.创建vue项目 1.安装nodejs( 傻瓜式 ...
- win10 IE浏览器中,设置指定程序查看源文件,设置查看源默认程序
解决 win10下修改ie默认查看网页源文件程序无效,设置View Source Editor ----> Editor Name注册表项无效 1. 修改注册表 计算机\HKEY_CLASSES ...
- selenium+鼠标操作+键盘操作+下拉框+弹出框+滚动条+三种等待--代码
鼠标操作 键盘操作 下拉框 弹出框 滚动条 1 from time import sleep 2 from selenium import webdriver 3 4 driver = webdriv ...
- connect及bind、listen、accept背后的三次握手
如图所示打上断点,分别找出connect() bind() listen() accpet()对应的函数 源码在上一次作业中已经分析过了 https://www.cnblogs.com/qwertyu ...
- 解决和根源:Unsolicited response received on idle HTTP channel starting with xxx
环境:golang,使用http client,服务器:iis +aspx.net动作:head请求或其他此问题见于各种请求情况.核心是,http在活动期间收到了非预期的信息.一开始我也很纳-闷,因为 ...
- idea初学
IDEA 什么是IDE IDEA官网 idea中文设置:打开右上角设置选择设置,选择Plugins ,搜索Chinese,安装插件后重启即可 IDEA基础语法 注释 编写代码量多时,项目结构复杂,需要 ...
- Oracle-账户被锁:The account is locked
Oracle-账户被锁:The account is locked cmd-->sqlplus--> 管理员登录:system@ORCL 密码:1 然后输入:alter user kjb( ...
- 截取屏幕 转为GIF 图片
近期winform 做的一个截取屏幕的软件给大家!谁要留言给我哦! sss
- ansible用authorized_key模块批量推送密钥到受控主机实现免密登录
一,ansible的authorized_key模块的用途 用来配置密钥实现免密登录: ansible所在的主控机生成密钥后,如何把公钥上传到受控端? 当然可以用ssh-copy-id命令逐台手动处理 ...