石川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

  1. 异步请求/操作
  • 异步:操作之间没有任何关系,可以同时进行多个操作
  • 同步:同时只能做一件事
  1. 优缺点
  • 异步缺点:代码更复杂
  • 同步优点:代码简单
//异步操作读取数据
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')
  1. 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("至少一个失败")
})
  1. 有了promise之后的异步
Promise.all([$.ajax({]}),$.ajax({})]).then(
results=>{
//全部成功之后的操作
},err=>{
//失败
}
)
  1. Promise其他用法
  • Promise.race() 竞速,与all区别是:只要有一个文件请求成功了就用谁,就会返回resolve
 

石川es6课程---12、Promise的更多相关文章

  1. 石川es6课程---1-2、ES6简介

    石川es6课程---1-2.ES6简介 一.总结 一句话总结: 从ECMAScript的历史发展来看,太顺了的时候总会遇到一挫折,比如ecma4 1.ECMAScript 和 JavaScript关系 ...

  2. 石川es6课程---13-16、generator-认识生成器函数

    石川es6课程---13-16.generator-认识生成器函数 一.总结 一句话总结: ` generator函数,中间可以停,到哪停呢,用 yield 配合,交出执行权 ` 需要调用next() ...

  3. 石川es6课程---18、ES6 复习

    石川es6课程---18.ES6 复习 一.总结 一句话总结: 无论在讲课和学习中,复习总结都是很重要 二.ES6 复习 变量 let const 声明方式 能否重复声明 作用域 类型 是否支持变量提 ...

  4. 石川es6课程---17、ES7 预览

    石川es6课程---17.ES7 预览 一.总结 一句话总结: 人的价值恒定规律:无论得意还是迷茫之时,你的价值都不靠外界的评判或者你内心的悲喜而决定.而是当时的恒定的.能够提升他只能靠你提升自己的能 ...

  5. 石川es6课程---11、json

    石川es6课程---11.json 一.总结 一句话总结: ` 感觉更方便了一点,增加了一些简写 ` key-value 一样时可以简写:console.log({ a,b}}) ` 里面函数可以简写 ...

  6. 石川es6课程---8、字符串

    石川es6课程---8.字符串 一.总结 一句话总结: · es6字符串新增两个方法:startsWith(以什么开头),endsWith(以什么结尾) · 新增反单引号:可以解析变量,可以折行:le ...

  7. 石川es6课程---7、数组

    石川es6课程---7.数组 一.总结 一句话总结: ^ 主要就map(映射:一个对一个),reduce(汇总:一堆出来一个),filter  过滤器,forEach 循环(迭代) 四个方法 ^ 使用 ...

  8. 石川es6课程---6、解构赋值

    石川es6课程---6.解构赋值 一.总结 一句话总结: 结构相同一一对应的方式赋值:let [json, arr, num, str] = [{ a: 1, b: 2 }, [1, 2, 3], 8 ...

  9. 石川es6课程---5、函数-参数

    石川es6课程---5.函数-参数 一.总结 一句话总结: ` 收集参数:收集剩余的参数,必须当到最后一个参数位置:function show(a, b, ...args) { ` 展开参数:展开数组 ...

随机推荐

  1. webpack开启本地服务器与热更新

    第一个webpack本地服务 webpack本地服务相关的一些操作指令与应用 一.第一个webpack本地服务 //工作区间 src//文件夹 index.js//入口文件 index.css//测试 ...

  2. rsync 文件同步 linux

    3.rsync+sersync更快更节约资源实现web数据同步4.unison+inotify实现web数据双向同步

  3. webpack 学习过程

    什么是WebPack,为什么要使用它? 为什要使用WebPack 现今的很多网页其实可以看做是功能丰富的应用,它们拥有着复杂的JavaScript代码和一大堆依赖包.为了简化开发的复杂度,前端社区涌现 ...

  4. 读书笔记《Oracle从入门到精通》

    目录 一.SQL基础 1.SQL种类 2.常用数据类型 3.DDL 4.约束 5.DML语句 二.SELECT语句 1.结果集'*'与指定列 2.拼接符 || 3.substr函数 4.instr函数 ...

  5. Delphi ActiveX编程

    樊伟胜

  6. 十五,K8S集群调度原理及调度策略

    目录 k8s调度器Scheduler Scheduler工作原理 请求及Scheduler调度步骤: k8s的调用工作方式 常用预选策略 常用优先函数 节点亲和性调度 节点硬亲和性 节点软亲和性 Po ...

  7. Cobbler自动化装机脚本

    #!/bin/bash ens33_ip=192.168.1.3 ens33_gateway=192.168.1.1 ens37_ip=192.168.207.2 dhcp_wd=192.168.20 ...

  8. Python assert statement

    Python assert statement 关于assert想找到文档中的例子:但是搜索python文档没找到. 看到这篇文章:对初学者很有帮助:https://www.programiz.com ...

  9. SpringMVC配置文件详解:<context:annotation-config/>和<context:component-scan base-package=""/>和<mvc:annotation-driven />

    原文地址:https://www.cnblogs.com/lcngu/p/5080702.html Spring配置文件详解:<context:annotation-config/>和&l ...

  10. (一)数据库系统概述和ER图

    1.数据库系统 数据库系统有数据库.数据库管理系统.应用系统和数据库管理员组成.数据库呢就是数据的集合,应用系统和管理员就不说了,数据库管理系统即常说的DBMS,比如我们用的mysql,oracle, ...