前端学习(三十六)promise(笔记)
一个页面: 头部、用户信息、新闻列表
jquery ajax:
1、
$.ajax({
url:'',
dataType:'json',
}).then(res=>{
//res : 成功后的返回
},err=>{
//err: 失败的对象
});
2、
let url = '';
$.ajax({
url,
data:
dataType:
...
success:function(res){
//res 成功后的数据
},
error(err){
//err 失败的对象信息
}
});
实现 : 头部,用户,新闻 三块功能
方法一:
$.ajax({url:'头部数据接口地址',success(res){用res来渲染头部页面}});
$.ajax({url:'用户数据接口地址',success(res){用res来渲染用户部分页面}});
$.ajax({url:'新闻数据接口地址',success(res){用res来渲染新闻部分页面}});
要求:等三部分数据都返回后,做点事情,打印三次请求的结果。
$.ajax({
url:'头部',
success(res){
//res
$.ajax({
url:'用户',
success(res){
//头部和用户都成功
$.ajax({
url:'新闻'
success(){
//三次都成功
}
});
}
});
}
});
==========================
以上,程序员 回调函数 —— 恶梦
直到 2015 年,ES6 出来了 —— Promise
Promise: —— 承诺、保证
多个异步请求全部完成后,要做的事情 —— 通过 Promise 来解决。
一、基本用法
let p1 = new Promise(function(resolve,reject){
$.ajax({
url:'',
data:
dataType:
...
success(res){
以前在这里直接处理res
现在不直接处理,要如下
resolve(res);
},
error(err){
reject(err);
}
});
});
p1.then(res=>{
//在这里处理成功的结果
},err=>{});
二、真正用法
Promise.all([Promise对象1,Promise对象2,...]).then(function(arr){
//说明,所有的请求都成功了
//arr[0] ——> 请求1的结果
//arr[1] ——> 请求2的结果
...
},function(err){
//只要有一个失败
});
三、封装
function creactPromise(url){
return new Promise(function(resolve,reject){
$.ajax....
});
}
四、jquery 的 ajax
let r =$.ajax({
.....
});
// r ——> 就是一个 Promise对象
$.ajax({}).then(res=>{},err=>{});
Promse.all([
$.ajax({}),
$.ajax({}),
$.ajax({})
...
]).then(arr=>{
//arr 对应多个请求的结果
},err=>{});
五、Promise.race
Promise.race([p1,p2....]).then(res=>{
//成功
res —— > 最先返回结果的那个请求
},err=>{});
//应用,对于同一个数据,多个数据接口提供请求,可以多个接口同时访问,哪个快就用哪个结果—— 保证用户能使用最快的数据
==========================
要求:当头部请求完成后,做点事,再去请求用户,用户请求完成后,做点事,再去请求新闻 ....
Generator: 生成器 —— 函数
1. 把一个函数切分成若干个小函数
2. 把异步请求同步化
3. 可以暂停的函数
语法:
function* show(){
alert(1);
alert(2);
}
let ge = show(); // ge -- Generator 对象
ge.next(); //下一个 , 触发 Generator 函数的执行
暂停: 在函数里面 , 使用
yield —— 只用于 Generator 函数里。
generator:
1) function*
2) 返回 Generator 对象
3) 可以暂停
yield
4) obj.next()
yield:
1)暂停函数
2)可以返回中间结果
3)可以接收中间参数
* yield 相当于把函数切分为若干段 ,yield 属于下半段
==========================
返回值:
obj.next(); —— 返回值:
{
done: false
value: yield 返回结果
}
* yield 返回值 属于上一部分
* 每一个next 对应的是切分后的一部分(不是对应一个 yield)
* 中间过程返回值 通过 yield ,最后的结果返回,通过 return
中间过程: done : false
整体结束: done: true
==========================
回顾:
function* show(){
alert('a');
yield x;
alert('b');
yield y;
return z;
}
//以上函数被分为3块,
第一块: alert('a'); x
第二块: yield alert('b'); y
第三块: yield return z;
//以下的next 对应的是每一块
let obj = show();
let r1 = obj.next(); //r1:{value:x,done:false}
let r2 = obj.next(); //r2:{value:y,done:false}
let r3 = obj.next(); //r3:{value:z,done:true}
==========================
接收中间参数:
obj.next(传入的参数);
使用 Generator 的意义:
1、什么时候停止,停止多久,什么时候再开始, 是可以通过程序控制;
2、在函数每次停止和下一次开始之间,可以做一些其它的操作;
==========================
题:
function* show(){
let a = 12;
let b = yield 5;
let c = 99;
let d = yield;
alert(a+b-c*d);
}
要求:把 5 接出来,乘以2,再传回去,程序如何写,结果是什么?
==========================
回顾场景:
三次请求: 头,用户,新闻
要求: 头
用户
新闻
实现:
一:回调嵌套
二:Generator
function* show(){
yield $.ajax({请求头部});
yield $.ajax({请求用户信息});
yield $.ajax({请求新闻信息});
}
let obj = show();
let r1 = obj.next(); //r1 : 头部的返回结果
....
obj.next();
....
obj.next();
..
obj.next();
==========================
ES6总结:
let
const
块作用域
()=>
1、 this 指向父级作用域
2、arguments 不能用
3、简写
如果 参数只有一个,可以省略小括号
如果 函数体只有一句话,并且是 return, 可以省略 大括号 和 return
...
应用:
1、扩展函数参数
function show(a,b,...args){}
2、复制数组
let arr2 = [...arr1];
方法:
a) 循环复制
b) ...
c) let arr2 = Array.from(arr1)
Map
let map = new Map();
map.set('key',value);
map.get('key');
map.delete('key');
for..of:
for(let item of map)
for(let item of map.entries())
for(let key of map.keys())
for(let val of map.values())
模块化:
定义/导出:
let a = 12;
let b = '';
export default {
a,b
}
使用:
import modA from 'a.js'
JSON简写:
1、 变量
let a= 12;
{
//a:a
a
}
2、函数:
{
show:function(){},
show2(){
}
}
解构赋值:
左边和右边结构一致;
数组方法:
let arr2 = arr.map(item=>{
return item + 1;
});
arr.forEach((val,index)=>{
});
let arr2 = arr.filter(item=>{
return item>10;
});
arr.reduce((pre,cur,index,self)=>{
return x; // x 做为下一次的前一个
});
arr.reduce((pre,cur,index,self)=>{},pre2);
应用:
1)数组求和
2)二维数组扁平化
面向对象:
class Person{
constructor(x){
this.x = x;
}
show(){}
show2(){}
}
class Worker extends Person{
construnctor(){
super();
this.x = x;
....
}
show(){}
}
`` 字符串板
`fdsafd${x}safdas`
startsWith
endsWith
Promise:
Generator:
==========================
Bootstrap:
前端布局的框架。主要应用于响应式的页面。
官网:http://www.bootcss.com/
组成:
基本样式
组件
Javascript 插件
* 强依赖于 jquery
原则:
1.引入库文件
bootstrap.css
jquery.js
bootstrap.js
下载:
npm:
npm i bootstrap
不会下载 jquery
npm i jquery
bower:(安装 git )
bower i bootstrap
2.基本结构
div.container —— 容器
div.row —— 行
div.col-
内容
3.栅格
整个页面分成12列
4. 列偏移
col-sm-offset-4
5.列排序
col-sm-push-*
col-sm-pull-*
6.响应式工具
.visible-sm
.hidden-sm
------------------------------
基本样式:
浮动:
pull-left
pull-right
清除浮动:
.clearfix
文本居中:
text-center
文本颜色:
text-primary
text-danger
按钮:
基本样式: btn
不同样式:
btn-primary
btn-danger
...
------------------------------
前端学习(三十六)promise(笔记)的更多相关文章
- Java开发学习(三十六)----SpringBoot三种配置文件解析
一. 配置文件格式 我们现在启动服务器默认的端口号是 8080,访问路径可以书写为 http://localhost:8080/books/1 在线上环境我们还是希望将端口号改为 80,这样在访问的时 ...
- 前端学习(十六):JavaScript运算
进击のpython ***** 前端学习--JavaScript运算 在这一节之前,应该做到的是对上一节的数据类型的相关方法都敲一遍,加深印象 这部分的知识的特点就是碎而且杂,所以一定要多练~练习起来 ...
- 前端学习(三十九)移动端app(笔记)
移动端App 开发App的三种方式 Native App 原生 底层语言 java Android oc ...
- 前端学习(三十八)vue(笔记)
Angular+Vue+React Vue性能最好,Vue最轻=======================================================Angular ...
- 前端学习(三十五)模块化es6(笔记)
RequireJs:一.安装.下载 官网: requirejs.org Npm: npm i requirejs二.使用 以前的开发方式的问题: 1).js 是阻塞加 ...
- 前端学习(三十四)对象&模块化(笔记)
人,工人 //类的定义 function Person(name,age){ //构造函数 //工厂模式 //1.原料 //var obj = new ...
- 前端学习(三十)es6的一些问题(笔记)
赋值表达式 document.onclick = document.onmouseover = fn; var a = b = c = d = 5; 不推荐 逗号表 ...
- 前端学习(二十六)移动端s(笔记)
===================================================弹性布局rem布局---------------------------------------- ...
- Salesforce LWC学习(三十六) Quick Action 支持选择 LWC了
本篇参考: https://developer.salesforce.com/docs/component-library/documentation/en/lwc/lwc.use_quick_act ...
随机推荐
- [洛谷 P1013] NOIP1998 提高组 进制位
问题描述 著名科学家卢斯为了检查学生对进位制的理解,他给出了如下的一张加法表,表中的字母代表数字. 例如: L K V E L L K V E K K V E KL V V E KL KK E E K ...
- ModelViewSet的用法
- MySQL基础篇——安装、管理
MySQL 安装 所有平台的 MySQL 下载地址为https://dev.mysql.com/downloads/mysql/ .挑选你需要的 MySQL Community Server 版本及对 ...
- php大文件断点续传
该项目核心就是文件分块上传.前后端要高度配合,需要双方约定好一些数据,才能完成大文件分块,我们在项目中要重点解决的以下问题. * 如何分片: * 如何合成一个文件: * 中断了从哪个分片开始. 如何分 ...
- Prime算法 与 Kruskal算法求最小生成树模板
算法原理参考链接 ==> UESTC算法讲堂——最小生成树 关于两种算法的复杂度分析 ==> http://blog.csdn.net/haskei/article/details/531 ...
- FastDFS整合nginx模块报错
之前在本地虚拟机用的都是5.1的版本和1.12的nginx,在服务器上尝试一下高版本的6.1 一直报错各种,例如: undeclared (first use in this function) 尝试 ...
- python中将12345转换为54321
#将12345转换为54321 a = 12345789 ret = 0 #当a不为零的时候,循环条件为true,执行语句块 while a : #对a求余数,第一次循环则把5求出来 last = a ...
- Python网络爬虫-爬取微博热搜
微博热搜的爬取较为简单,我只是用了lxml和requests两个库 url=https://s.weibo.com/top/summary?Refer=top_hot&topnav=1& ...
- Android O编译前修改文件和目录权限
当需要修改某文件或路径权限时,我们可以在init.rc开机启动某节点添加chmod命令进行修改.但是对于system分区,由于是ro权限,在init.rc使用chmod修改权限无效.需要在文件编译时, ...
- Oracle创建dblink进行跨数据库操作
创建dblink:create public database link link_to_test connect to 用户名 IDENTIFIED by "密码大写" usin ...