石川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. ado.net 断开 非断开

    非断开 SqlConnection SqlCommand / SqlDataReader 接 断开 SqlConnection SqlDataAdapter / DataSet 接

  2. ElementUI Hello World

    Vue Element UI Hello World <!DOCTYPE html> <html> <head> <meta charset="ut ...

  3. js动态添加控件(输入框为例)

    写在前面 昨天得到一个需求,需要在账户登记页面中动态添加输入框,经过半天的捣鼓,最终完美成型,写下来跟大家分享下, 供大家参考 开始复制代码了 如果复制了我所有代码的话,注意看js最后面方法的备注,最 ...

  4. 内置函数 lambda sorted filter map 递归

    一 lambda 匿名函数 为了解决一些简单的需求而设计的一句话函数 # 计算 n 的 n次方 def func(n): return n**n print(func(10)) f = lambda ...

  5. 8.5.zookeeper应用案例_分布式应用HA

    1.实现分布式应用(主节点HA)及客户端动态更新主节点状态 需求:某分布式系统中,主节点可以有多台,服务器可以动态(变化)上下线,任意一台客户端都能实时感知到主节点服务器的上下线 思路:架设Zooke ...

  6. 1.python环境安装

    一:安装Python与环境配置 二:安装pip 三:Anaconda安装和使用 3.1 什么是 Anaconda? Anaconda是专注于数据分析的Python发行版本,支持 Linux, Mac, ...

  7. Delphi用QJSON解析JSON格式的数据 【转】

    本来用superobject来解析JSON已经够用了,可惜这个东东不能在移动端使用,于是找到QJSON来处理. 这是一个国内高手写开源免费的东西,赞一个. 假入数据如下: {"message ...

  8. xtrabackup的使用

    Percona-xtrabackup是 Percona公司开发的一个用于MySQL数据库物理热备的备份工具. 一.安装xtrabackup 采用rpm包的方式进行安装 [root@server- ~] ...

  9. Selenium(2)

    testing123456peter123456rose123456 一.常见的运行错误: 1.[error] Timed out after 30000ms Timed out:超时 after:之 ...

  10. Python学习笔记----数据类型 运算符 循环 条件判断

    1. Python安装 在官网www.python.org下载安装程序,可以支持的操作系统linux,windows,mac. Python版本:2.x和3.x,分别有x86和x64. 在Window ...