

1.Promise 用于解決異步編程
/* * 比如說 ajax 就是一個異步操作 , 之前的使用的回調函數的方式解決異步編程 * * $.ajax({ * url:’abc.com’, * success:function(res){ * * } * }) * * 場景: * 1.先獲取當前token是否已經失效 * 2.如果沒有失效,返回當前的token的用戶的基本信息(基本信息包含 uid ) * 3.根據uid 來查詢當前用戶的會員等級 * 4.再通過當前用戶的會員等級,來查詢當前用戶的特權(來檢測用戶是否有權限來執行某個操作) * * 案例: * 已知a.txt 地址 ,然后需要根據a.txt 返回的結果進行下一次的查詢 ,逐一查詢到最后的結果d.txt內容 * */
//使用jQuery 實現 = > 造成一個 “回調地獄”
$.ajax({
url:"data/a.txt",
success:function(res){
console.log('第一次:',res);
//再發出下一次請求
$.ajax({
url:res,
success:function(res){
console.log('第二次',res);
$.ajax({
url:res,
success:function (res) {
console.log('第三次:',res);
$.ajax({
url:res,
success:function (res) {
console.log("第四次:",res);
}
})
}
})
}
})
}
})
2. Promise 用于解決異步編程的一種解決方案, 也可以理解是一個執行異步操作的容器,在容器中封裝好了一套處理異步的流程機制
* 1.有三種狀態:pending(進行中)、fulfilled(已成功)和rejected(已失?。?/p>
* 2.一旦狀態改變,就不會再變,任何時候都可以得到這個結果。從pending – > fulfilled (成功) 或者 pending -> 和rejected (失敗) , 每次只能改變一次狀態
* * 常用方法
* all()
* race()
var promise = new Promise(function(resolve,reject){//創建一個promise容器 , resolve 一個用于在處理異步成功時調用的函數 , reject 處理異步失敗的時候調用的函數 setTimeout(function(){ //通過延時定時器模擬異步 , 2000ms 結束后就可以調用成功或者失敗 console.log(‘時間到了!!!’); resolve(123456); reject(12) },2000); }); //當實例化Promise之后(已經執行異步操作) , (結果怎么樣)然后呢? then() 編寫需要執行的回調業務 promise.then(function(res){ console.log(“執行成功!”,res); },function(err){ console.log(“執行失敗!”,err); });
3.使用promise 異步編程封裝一個ajax模塊
//使用promise 異步編程封裝一個ajax模塊
function Ajax(url){
//創建一個Promise實例
return new Promise(function(resolve,reject){
var xhr = new XMLHttpRequest();
//綁定請求過程狀態改變事件
xhr.onreadystatechange = function () {
if(xhr.readyState==4){
if((xhr.status >= 200 && xhr.status<=304)){
resolve(xhr.responseText);
}else{
reject(xhr.statusText);
}
}
}
//發起請求
xhr.open("get",url);
xhr.send(null);
});
}
//使用
// all() 可以同時擁有幾個異步操作, 如果有一個失敗 ,則觸發失敗
// Promise.all([Ajax('data/a.txt'),Ajax('data/b.txt'),Ajax('data/c3.txt')]).then(function (res) {
// console.log("成功:",res);
// }).catch(function (err) {
// console.log("失敗:",err);
// })
//race() 競速
Promise.race([Ajax('data/a.txt'),Ajax('data/b.txt'),Ajax('data/c3.txt')]).then(function (res) {
console.log("成功:",res);
}).catch(function (err) {
console.log("失敗:",err);
})
4.使用promise 異步編程封裝一個ajax模塊
function Ajax(url){
//創建一個Promise實例
return new Promise(function(resolve,reject){
var xhr = new XMLHttpRequest();
//綁定請求過程狀態改變事件
xhr.onreadystatechange = function () {
if(xhr.readyState==4){
if((xhr.status >= 200 && xhr.status<=304)){
resolve(xhr.responseText);
}else{
reject(xhr.statusText);
}
}
}
//發起請求
xhr.open("get",url);
xhr.send(null);
});
}
//使用
Ajax("data/a.txt")
.then(function (res) {
console.log("第一次成功:",res);
//調用下一次
return Ajax(res);
}).then(function (res) {
console.log("第二次成功:",res);
return Ajax(res);
}) .then(function (res) {
console.log("第三次成功:",res);
//調用下一次
return Ajax(res);
}).then(function (res) {
console.log("第四次成功:",res);
}).catch(function () {
console.log("最后請求失敗!!!");
})
// promise().then(()=>{},()=>{})
// promise().then(()=>{}).catch(()=>{})
5.語法糖 (提供一種代碼更加簡潔,方便的做法,與之之前的實現過程相比,感覺像是吃了糖一樣美滋滋)
// var a = 10;
// var b = 20;
// var c = 30;
// var d = 40;
//ES6實現 – 數組形式解構賦值
let [a, b, c, d, e, f] = [10, 20, 30, 40, 50];
//對象形式解構賦值 , 定義abc , hhh 變量 , 將等號右邊的foo的值賦值給abc , 等號右邊的bar的值賦值給hhh
let { foo: abc, bar: hhh } = { foo: "啊啊啊啊啊", bar: "呵呵呵呵呵" }
//es6的對象中有一個簡寫方式
var name = "張三";
var obj = {
name, // 等于 name:name ,在對象中如果屬性名與屬性值的變量名一樣 ,就可以簡寫
run() {
console.log('奔跑方法');
}
}
let { foo, bar } = { foo: "啊啊啊啊啊", bar: "呵呵呵呵呵" };
/*
使用場景 :
restFul API 規范的接口
{
code:200,
msg:"加載用戶余額數據成功!",
data:[
{
id:123123,
money:1000
},
{
id:123123,
money:1000
}
]
}
*/
var obj = {
data: {
res: {
code: 200,
msg: "加載用戶余額數據成功!",
data: [
{
id: 123123,
money: 1000
},
{
id: 123123,
money: 1000
}
]
}
}
}
//使用ES6 解構賦值快速搞定
let { code , data , msg} = obj.data.res;
//需要根據返回的狀態碼 ,做出對應的提示內容(彈窗) ,將數據列表輸出在控制臺
// if (obj.data.res.code == 200) {
// alert(obj.data.res.msg);
// console.log(obj.data.res.data);
// }
if (code == 200) {
alert(msg);
console.log(data);
}
6.字符串:
* 1.新增一些常用方法:
* includes() 用于檢測字符串中是否包含指定字符. , 返回布爾值
* startsWith() 用于檢測字符的開頭是否包含指定字符 , 返回布爾值
* endsWith() 用于檢測字符串的結尾是否包含指定字符 ,返回布爾值
* padStart(length,str) 對字符串進行length長度的前補位 ,不足使用str去補
padEnd(length,str) 對字符串進行length長度的后補位 ,不足使用str去補
repeat(times) 對字符串進行times 次重復
trimStart() 去除字符串開頭位置的空格
trimEnd() 去除字符串結束位置的空格
trim() 去除字符串前后的空格 * * * 2.模板字符串 * * */
var s = '10000';
console.log(s.padStart(8,0));
var studentName = '張三';
var bookName = "<<且聽風吟>>";
// document.write('<h3>'+studentName+"正在讀一本書,書名為"+bookName+'</h3>');
//使用ES6的模板字符串
document.write(`<h3>${studentName}正在讀一本書,書名為${bookName}</h3>`);
7.數據結構?? : 數據結構是計算機存儲、組織數據的方式。數據結構是指相互之間存在一種或多種特定關系的數據元素的集合
//數據類型:存儲的數據類型(boolean , string , undefined , null , number ,object , smybol) //Set() 集合
var set = new Set([1,2,3,4,5,5,3]);
console.log(set);
//1.不能直接使用下標訪問 ,一般通過一些遍歷方式得到值
//2.唯一性 : 在集合的內部 ,一個相同的值 只允許出現一次 (可以用來實現數組的去重)
var arr = [10,20,30,40,50,50,40,30,20,10];
var arr2 = new Set(arr);
console.log(arr2);
arr = Array.from(arr2); //將一些集合類型數據轉換成數組
//Map() 映射 , 為了解決傳統對象的鍵值對關系中, 鍵名只能以字符串數據類型的問題
var obj = {
20:'這是一個數字',
true:"這是一個true"
// [0,1,2]:'sssaadasad'
}
8.proxy (代理) :在目標對象之前架設一層“攔截”,外界對該對象的訪問,都必須先通過這層攔截,因此提供了一種機制,可以對外界的訪問進行過濾和改寫
var man = {
age: 8,
state: '兒童',
sex: '女',
name: "張三"
}
// man.age = -2500; //這樣設置無法對數據可靠性,安全性做出處理 ,很容易造成數據的混亂
//攔截處理 : get(在獲取屬性時會自動觸發) / set (在設置屬性時會自動觸發) , 在這種攔截機制中做出需要攔截的操作
var hanlder = {
set: function (target, key, value) {
console.log('正在準備設置對象的屬性...',target, key, value);
if(key == "age"){
if(value>=0 && value<=120){
target.age = value;
if(value>=0 && value<=12){ //實現在每次修改年齡的時候 ,根據修改年齡的數值決定對象屬性state的狀態 ,此處就與age屬性實現了數據的綁定,而不需要在每次設置age屬性的時候,都要去寫一遍判斷邏輯和操作state
target.state="兒童"
}else if(value>=13 && value <18){
target.state = "少年";
}else if(value>=19 && value <30){
target.state = "青年";
}else{
target.state = "老年人";
}
}else{
throw new Error('年齡輸入不合法!!');
}
}
},
get: function (target, key) {
// console.log('此處應該是獲取代理目標對象屬性的攔截操作...',target,key);
switch (key) {
case "age":
if (target.sex == '女') {
return '女孩子的年齡一般不能問的!!';
} else {
return target.age;
}
break;
default:
return target[key];
}
// return '數據保密!';
}
}
//實例化一個proxy , 其實就是對外提供的一個操作代理對象(操作時修改的就是prxoy對象,但是它會將數據再修改到目標對象上)
var proxy = new Proxy(man, hanlder);
console.log('年齡為:', proxy.age); //此時會觸發proxy中的get ,因為在獲取age屬性
proxy.age = 30;
9.async 函數 ,異步函數 : 目的就將異步操作變成同步操作的方式編寫
/** 使用關鍵字 async 聲明一個異步函數 , 在調用異步函數的之前使用await關鍵配合使用,來聲明當前執行的異步需要等待 ,等await關鍵字中的函數執行完之后 ,才會執行后邊的代碼 */
async function timeout(time) {
return new Promise((resolve, reject) => {
setTimeout(() => { //模擬一個異步操作,比如說是一次ajax交互
resolve(123);
}, time)
})
}
async function hello(title, time) {
let s = null;
await timeout(time).then((res) => {
// console.log(res);
s = res;
});
console.log(title + s);
}
hello("教育改變生活!!!!", 5000);
版權聲明:本文內容由互聯網用戶自發貢獻,該文觀點僅代表作者本人。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如發現本站有涉嫌抄襲侵權/違法違規的內容, 請發送郵件至 舉報,一經查實,本站將立刻刪除。