☆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. C语言中的循环

    1我觉得循环就是程序一直重复的执行一些语句,直到当符合条件时停止.循环总体分为while循环,do while循环和for循环. 2while循环和do while循环的区别:while是先判定是否符 ...

  2. Vue+SSM+Element-Ui实现前后端分离(1)

    前言:最近学习vue,就突发奇想,小菜鸟的我是时候锻炼锻炼自己.闲话不说,整起 <-_-> 整体规划:先搭建前端,接下来后端,最后整合. 一.创建vue项目 1.安装nodejs( 傻瓜式 ...

  3. win10 IE浏览器中,设置指定程序查看源文件,设置查看源默认程序

    解决 win10下修改ie默认查看网页源文件程序无效,设置View Source Editor ----> Editor Name注册表项无效 1. 修改注册表 计算机\HKEY_CLASSES ...

  4. selenium+鼠标操作+键盘操作+下拉框+弹出框+滚动条+三种等待--代码

    鼠标操作 键盘操作 下拉框 弹出框 滚动条 1 from time import sleep 2 from selenium import webdriver 3 4 driver = webdriv ...

  5. connect及bind、listen、accept背后的三次握手

    如图所示打上断点,分别找出connect() bind() listen() accpet()对应的函数 源码在上一次作业中已经分析过了 https://www.cnblogs.com/qwertyu ...

  6. 解决和根源:Unsolicited response received on idle HTTP channel starting with xxx

    环境:golang,使用http client,服务器:iis +aspx.net动作:head请求或其他此问题见于各种请求情况.核心是,http在活动期间收到了非预期的信息.一开始我也很纳-闷,因为 ...

  7. idea初学

    IDEA 什么是IDE IDEA官网 idea中文设置:打开右上角设置选择设置,选择Plugins ,搜索Chinese,安装插件后重启即可 IDEA基础语法 注释 编写代码量多时,项目结构复杂,需要 ...

  8. Oracle-账户被锁:The account is locked

    Oracle-账户被锁:The account is locked cmd-->sqlplus--> 管理员登录:system@ORCL 密码:1 然后输入:alter user kjb( ...

  9. 截取屏幕 转为GIF 图片

    近期winform 做的一个截取屏幕的软件给大家!谁要留言给我哦! sss

  10. ansible用authorized_key模块批量推送密钥到受控主机实现免密登录

    一,ansible的authorized_key模块的用途 用来配置密钥实现免密登录: ansible所在的主控机生成密钥后,如何把公钥上传到受控端? 当然可以用ssh-copy-id命令逐台手动处理 ...