前端学习(三十六)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 ...
随机推荐
- Nginx 禁止IP访问 只允许域名访问
今天要在Nginx上设置禁止通过IP访问服务器,只能通过域名访问,这样做是为了避免别人把未备案的域名解析到自己的服务器IP而导致服务器被断网,从网络上搜到以下解决方案: Nginx的默认虚拟主机在用户 ...
- gitlab+jenkins自动化打包APK
前置条件: 环境搭建,jenkins需要的插件看这里: gitlab+jenkins自动化打包IOS 配置思路: step1: 搭建sdk,gradle运行环境,参照: CentOS7下安装安装and ...
- 拒绝从入门到放弃_《鸟哥的 Linux 私房菜 — 基础学习篇(第三版)》必读目录
目录 目录 前言 关于这本书 必看知识点 最后 前言 相信部分刚进入这个行业的新同学会对一个问题感到疑惑,为什么从培训学校出来的学员不被欢迎? 这里记录下一些我个人的看法(博主也曾有面试新员工的经历) ...
- python web自动化测试框架搭建(功能&接口)——功能测试模块
功能测试使用selenium,模块有: 1.futil: 公共方法,如元素高亮显示 # coding=utf-8 """高亮显示元素""" ...
- JS对象—字符串总结(创建、属性、方法)
1.创建字符串 1.1 new String(s) String和new一起使用,创建的是一个字符串对象,存放的是字符串s的表示. 1.2 String(s) ...
- MySQL 查询语句--------------进阶9:联合查询
#进阶9:联合查询 /* union 联合 合并:将多条查询语句的结果合并成一个结果 语法: 查询语句1 union 查询语句2 union..... 应用场景:要查询的结果来自于多个表,且多个表没有 ...
- Logistic Regression Algorithm解决分类问题
在线性回归算法中,我们看到,在training set中,输入矩阵X与向量y的值都是连续的.所以在二维空间中,我们可以用一条直线去模拟X与y的变化关系,寻找参数向量theta的取值.如根据房屋面积预测 ...
- apt-get updete以及apt-get upgrade的区别
You should first run update, then upgrade. Neither of them automatically runs the other. apt-get upd ...
- window.location.href后携带参数
JS文件中: window.location.href后可携带参数,但是不安全,虽然在技术上是可以实现的 1.传参:window.location.href = "RecordCare.as ...
- java 工厂模式 从无到有-到简单工厂模式-到工厂方法模式-抽象工厂模式
工厂模式定义(百度百科): 工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式.著名的Jive论坛 ,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见.因为工 ...