石川es6课程---12、Promise
石川es6课程---12、Promise
一、总结
一句话总结:
用同步的方式来书写异步代码,让异步书写变的特别简单
用同步的方式来书写异步代码
Promise 让异步操作写起来,像在写同步操作的流程,不必一层层地嵌套回调函数
改善了可读性,对于多层嵌套的回调函数很方便
充当异步操作与回调函数之间的中介,使得异步操作具备同步操作的接口
1、传统的异步写法?
嵌套操作
ajax('./banners',function(banner_data){
ajax('./hotItems',function(hotItem_data){
ajax('./slides',function(slide_data){
},function(){alert("读取失败")})
},function(){alert("读取失败")})
},function(){alert("读取失败")})
2、传统的同步操作数据?
同时只能做一件事
let banner_data=ajax_sync('./banners')
let hotItem_data=ajax_sync('./hotItems')
let slide_data=ajax_sync('./slides')传统的同步操作数据
3、jquery中ajax方法的回调函数的作用是什么?
$.ajax是不同操作的回调函数,$.post是发送成功的回调函数
如果要处理$.ajax()得到的数据,则需要使用回调函数。beforeSend、error、dataFilter、success、complete。 beforeSend 在发送请求之前调用,并且传入一个XMLHttpRequest作为参数。
error 在请求出错时调用。传入XMLHttpRequest对象,描述错误类型的字符串以及一个异常对象(如果有的话)
dataFilter 在请求成功之后调用。传入返回的数据以及"dataType"参数的值。并且必须返回新的数据(可能是处理过的)传递给success回调函数。
success 当请求之后调用。传入返回后的数据,以及包含成功代码的字符串。
complete 当请求完成之后调用这个函数,无论成功或失败。传入XMLHttpRequest对象,以及一个包含成功或错误代码的字符串。 $.ajax({ url: "test.html", cache: false, success: function(html){ $("#results").append(html); } });
4、Promise实例?
用Promise.all(),全部成功一个回调函数,失败一个回调函数
Promise.all()函数
let p1=new Promise(function(resolve,reject){
//异步代码
//resolve成功
//reject失败
$.ajax({
url:'https://easy-mock.com/mock/5cadb508b56fc13f6206ad0e/example/arr.txt',
type:'get',
dataType:'json',
success(arr){
resolve(arr)
},
error(err){
reject(err)
}
})
})
let p2=new Promise(function(resolve,reject){
$.ajax({
url:'https://easy-mock.com/mock/5cadb508b56fc13f6206ad0e/example/json.txt',
dataType:'json',
type:'get',
success:function(data){
resolve(data)
},
error:function(err){
reject(err)
}
})
})
Promise.all([p1,p2]).then(function(arr){
let [res1,res2]=arr
console.log(res1,res2)
},function(){
alert("至少一个失败")
})
二、Promise
异步和同步
- 异步,操作之间没有关系,同时执行多个操作, 代码复杂
- 同步,同时只能做一件事,代码简单
Promise 对象
- 用同步的方式来书写异步代码
- Promise 让异步操作写起来,像在写同步操作的流程,不必一层层地嵌套回调函数
- 改善了可读性,对于多层嵌套的回调函数很方便
- 充当异步操作与回调函数之间的中介,使得异步操作具备同步操作的接口
Promise 也是一个构造函数
- 接受一个回调函数f1作为参数,f1里面是异步操作的代码
- 返回的p1就是一个 Promise 实例
- 所有异步任务都返回一个 Promise 实例
- Promise 实例有一个then方法,用来指定下一步的回调函数
function f1(resolve, reject) {
// 异步代码...
}
var p1 = new Promise(f1);
p1.then(f2); // f1的异步操作执行完成,就会执行f2。
- Promise 使得异步流程可以写成同步流程
// 传统写法
step1(function (value1) {
step2(value1, function(value2) {
step3(value2, function(value3) {
step4(value3, function(value4) {
// ...
});
});
});
});
// Promise 的写法
(new Promise(step1))
.then(step2)
.then(step3)
.then(step4);
- Promise.all(promiseArray)方法
- 将多个Promise对象实例包装,生成并返回一个新的Promise实例
- promise数组中所有的promise实例都变为resolve的时候,该方法才会返回
- 并将所有结果传递results数组中
- promise数组中任何一个promise为reject的话,则整个Promise.all调用会立即终止,并返回一个reject的新的promise对象
var p1 = Promise.resolve(1),
p2 = Promise.resolve(2),
p3 = Promise.resolve(3);
Promise.all([p1, p2, p3]).then(function (results) {
console.log(results); // [1, 2, 3]
});
- Promise.race([p1, p2, p3])
- Promse.race就是赛跑的意思
- 哪个结果获得的快,就返回那个结果
- 不管结果本身是成功状态还是失败状态
3、Promise
- 异步请求/操作
- 异步:操作之间没有任何关系,可以同时进行多个操作
- 同步:同时只能做一件事
- 优缺点
- 异步缺点:代码更复杂
- 同步优点:代码简单
//异步操作读取数据
ajax('./banners',function(banner_data){
ajax('./hotItems',function(hotItem_data){
ajax('./slides',function(slide_data){
},function(){alert("读取失败")})
},function(){alert("读取失败")})
},function(){alert("读取失败")})
//同步操作数据
let banner_data=ajax_sync('./banners')
let hotItem_data=ajax_sync('./hotItems')
let slide_data=ajax_sync('./slides')
- Promise——清除异步操作
- 本质:用同步一样的方式写异步
- 用法: 基本的封装ajax
let p1=new Promise(function(resolve,reject){
//异步代码
//resolve成功
//reject失败
$.ajax({
url:'https://easy-mock.com/mock/5cadb508b56fc13f6206ad0e/example/arr.txt',
type:'get',
dataType:'json',
success(arr){
resolve(arr)
},
error(err){
reject(err)
}
})
})
p1.then(function(){},function(){})
Promise.all()函数
let p1=new Promise(function(resolve,reject){
//异步代码
//resolve成功
//reject失败
$.ajax({
url:'https://easy-mock.com/mock/5cadb508b56fc13f6206ad0e/example/arr.txt',
type:'get',
dataType:'json',
success(arr){
resolve(arr)
},
error(err){
reject(err)
}
})
})
let p2=new Promise(function(resolve,reject){
$.ajax({
url:'https://easy-mock.com/mock/5cadb508b56fc13f6206ad0e/example/json.txt',
dataType:'json',
type:'get',
success:function(data){
resolve(data)
},
error:function(err){
reject(err)
}
})
})
Promise.all([p1,p2]).then(function(arr){
let [res1,res2]=arr
console.log(res1,res2)
},function(){
alert("至少一个失败")
})
通用封装
function createPromise(url){
return new Promise(function(resolve,reject){
//异步代码
//resolve成功
//reject失败
$.ajax({
url:url,
type:'get',
dataType:'json',
success(arr){
resolve(arr)
},
error(err){
reject(err)
}
})
})
}
Promise.all([createPromise("https://easy-mock.com/mock/5cadb508b56fc13f6206ad0e/example/arr.txt"),createPromise("https://easy-mock.com/mock/5cadb508b56fc13f6206ad0e/example/json.txt")]).then(function(arr){
let [res1,res2]=arr
console.log(res1,res2)
},function(){
alert("至少一个失败")
})
- 有了promise之后的异步
Promise.all([$.ajax({]}),$.ajax({})]).then(
results=>{
//全部成功之后的操作
},err=>{
//失败
}
)
- Promise其他用法
- Promise.race() 竞速,与all区别是:只要有一个文件请求成功了就用谁,就会返回resolve
石川es6课程---12、Promise的更多相关文章
- 石川es6课程---1-2、ES6简介
石川es6课程---1-2.ES6简介 一.总结 一句话总结: 从ECMAScript的历史发展来看,太顺了的时候总会遇到一挫折,比如ecma4 1.ECMAScript 和 JavaScript关系 ...
- 石川es6课程---13-16、generator-认识生成器函数
石川es6课程---13-16.generator-认识生成器函数 一.总结 一句话总结: ` generator函数,中间可以停,到哪停呢,用 yield 配合,交出执行权 ` 需要调用next() ...
- 石川es6课程---18、ES6 复习
石川es6课程---18.ES6 复习 一.总结 一句话总结: 无论在讲课和学习中,复习总结都是很重要 二.ES6 复习 变量 let const 声明方式 能否重复声明 作用域 类型 是否支持变量提 ...
- 石川es6课程---17、ES7 预览
石川es6课程---17.ES7 预览 一.总结 一句话总结: 人的价值恒定规律:无论得意还是迷茫之时,你的价值都不靠外界的评判或者你内心的悲喜而决定.而是当时的恒定的.能够提升他只能靠你提升自己的能 ...
- 石川es6课程---11、json
石川es6课程---11.json 一.总结 一句话总结: ` 感觉更方便了一点,增加了一些简写 ` key-value 一样时可以简写:console.log({ a,b}}) ` 里面函数可以简写 ...
- 石川es6课程---8、字符串
石川es6课程---8.字符串 一.总结 一句话总结: · es6字符串新增两个方法:startsWith(以什么开头),endsWith(以什么结尾) · 新增反单引号:可以解析变量,可以折行:le ...
- 石川es6课程---7、数组
石川es6课程---7.数组 一.总结 一句话总结: ^ 主要就map(映射:一个对一个),reduce(汇总:一堆出来一个),filter 过滤器,forEach 循环(迭代) 四个方法 ^ 使用 ...
- 石川es6课程---6、解构赋值
石川es6课程---6.解构赋值 一.总结 一句话总结: 结构相同一一对应的方式赋值:let [json, arr, num, str] = [{ a: 1, b: 2 }, [1, 2, 3], 8 ...
- 石川es6课程---5、函数-参数
石川es6课程---5.函数-参数 一.总结 一句话总结: ` 收集参数:收集剩余的参数,必须当到最后一个参数位置:function show(a, b, ...args) { ` 展开参数:展开数组 ...
随机推荐
- 快速写个node命令行工具
1.package.json-bin配置 [创建bat文件,把bat路径添加到PATH中]这些固定的工作可以由npm帮我们完成.package.json中有个bin字段配置: bin: { " ...
- BootStrape基础使用
官网:www.bootcss.com 一. 全局css样式 栅格系统 栅格系统用于通过一系列的行(row)与列(column)的组合来创建页面布局 <!DOCTYPE html> < ...
- 创建LEANGOO看板
转自:https://www.leangoo.com/leangoo_guide/leangoo_guide_create_kanban.html#toggle-id-3 Leangoo使用看板来管理 ...
- (๑•̀ㅂ•́)و✧QQ用户信息管理系统
这是第二篇文章,就直接切主题 这次剖析的也是自己的作业之一:QQ信息管理系统 一:(此处省略了建Proarams类,其实目的只是想强调把连接语句单独放一个类里更容易调用,命名规范如图) 二:(导入SQ ...
- 【转】bitbake 笔记
原文 http://blog.csdn.net/xiaofeng_yan/article/details/6757725 1 当你已经编完一个系统比如sato映像,在编一个meta-toolchain ...
- ProgressDialog 进度条的初步认识
public class MainActivity extends Activity implements View.OnClickListener{ private ProgressBar prog ...
- 寒武纪C++日常实习生面经(其他人面试题)
1.C++继承方式? 答:public,protected,private三种继承方式和虚继承一共四种. 派生类可以继承定义在基类中的成员,但是派生类的成员函数不一定有权访问从基类继承而来的成员. 派 ...
- demjson
demjson.decode() 可以扩展json的类型
- 基础简单DP
状态比较容易表示,转移方程比较好想,问题比较基本常见 递推.背包.LIS(最长递增序列),LCS(最长公共子序列) HDU 2048 数塔 由上往下推 状态数太多(100!) 可以由下往上推: d ...
- PAT乙级1018
题目链接 https://pintia.cn/problem-sets/994805260223102976/problems/994805304020025344 题解 刚开始做很懵逼,可能并不难吧 ...