
批改狀態(tài):合格
老師批語(yǔ):異步執(zhí)行那塊確實(shí)有點(diǎn)問(wèn)題
(一)同步與異步
以銀行排隊(duì)辦業(yè)務(wù)為例
哪些是異步任務(wù)(耗時(shí))?
setTimeout, setInterval
addEventListener
ajax, promise,fetch
(二) 進(jìn)程與線程
(三) 單線程,任務(wù)隊(duì)列,事件循環(huán)之間的關(guān)系與協(xié)同
此圖異步執(zhí)行原理有誤,個(gè)人理解
- 創(chuàng)建對(duì)象:
new XMLHttpRequest()
;- 響應(yīng)類(lèi)型:
xhr.responseType = "json"
;- 配置參數(shù):
xhr.open("GET", url, true)
;- 請(qǐng)求回調(diào):
xhr.onload = () => console.log(xhr.response)
;- 失敗回調(diào):
xhr.onerror = () => console.log("Error")
;- 發(fā)起請(qǐng)求:
xhr.send(null)
;xhr
至少監(jiān)聽(tīng)2個(gè)事件:load,error
, 調(diào)用2個(gè)函數(shù):open
,send
post
請(qǐng)求,需要設(shè)置一下請(qǐng)求頭與請(qǐng)求的數(shù)據(jù),其它與get
請(qǐng)求完全相同
<button onclick="getUser1(this)">查詢用戶信息: XHR</button>
<script>
function getUser1(btn) {
//1. 創(chuàng)建對(duì)象
const xhr = new XMLHttpRequest();
//2. 響應(yīng)類(lèi)型
xhr.responseType = "json";
//3. 配置參數(shù)
// 不傳get參數(shù),默認(rèn)返回全部用戶, 用table顯示
let url = "http://website.io/users.php";
// 如果有g(shù)et參數(shù),用戶id,用ul列表顯示
// url = "http://website.io/users.php?id=1";
xhr.open("GET", url);
//4. 請(qǐng)求回調(diào)
xhr.onload = () => {
console.log(xhr.response);
// 將數(shù)組渲染到頁(yè)面中
render(xhr.response, btn);
};
//5. 失敗回調(diào)
xhr.onerror = () => console.log("Error");
//6. 發(fā)起請(qǐng)求
xhr.send(null);
}
</script>
<script src="../js/function.js"></script>
語(yǔ)法:
fetch(url).them(getRes).them(handleRes).catch(err)
url
請(qǐng)求響應(yīng)地址getRes
回調(diào)函數(shù) 返回jsonresponse.json()
handleRes
回調(diào)函數(shù) 得到JSON并處理err
處理異步執(zhí)行的錯(cuò)誤信息
fetch api
瀏覽器原生實(shí)現(xiàn)的異步技術(shù)axios
基于 xhr / fetchfetch
基于Promise, 返回 Promise對(duì)象
window.addEventListener("load", ()=>{
let url = "https://jsonplaceholder.typicode.com/users";
fetch(url)
.then((response) => response.json())
.then((json) => {
// 打印到控制臺(tái)
console.log(json);
});
},false)
fetch異步編程語(yǔ)法糖
async
與await
// async:聲明此函數(shù)是異步任務(wù)
window.addEventListener(
"load",
async () => {
let url = "https://jsonplaceholder.typicode.com/users";
// 異步耗時(shí)操作,需要等待結(jié)果才可進(jìn)入下一步
const response = await fetch(url);
// 獲取到結(jié)果之后,再轉(zhuǎn)為json
const result = await response.json();
console.log(result);
},
false
);
模板導(dǎo)出
// 1.逐個(gè)導(dǎo)出
export let userName = "張三";
export let sex = "male";
// 2.統(tǒng)一導(dǎo)出
// (1)聲明
let hello = "hello";
function getHello(hello, userName) {
return `${hello}:${userName}`;
}
// (2)導(dǎo)出: 對(duì)象字面量 {...}
export { hello, getHello };
// 3.別名導(dǎo)出
let prodName = "華為手機(jī)";
let price = 5000;
function prdoPrice(prodName, price) {
return `手機(jī):${prodName} , 價(jià)格:${price}`;
}
export { prodName as n, price as p, prdoPrice as fn };
// 4.默認(rèn)導(dǎo)出 只導(dǎo)出一個(gè)值 一個(gè)模塊,只能有一個(gè)默認(rèn)導(dǎo)出
export default class {
constructor(userName) {
this.userName = userName;
}
getUserName() {
return `Hello ${this.username}`;
}
}
// 5.混合導(dǎo)出 默認(rèn)成員和非默認(rèn)成員
// (1) 默認(rèn)成員 第四點(diǎn)已導(dǎo)出
// (2) 非默認(rèn)成員
let email = "1331440618@qq.com";
// 私有成員, 不對(duì)外 不導(dǎo)出
let userSex = "male";
export { email };
// 可以將郵箱 email 做為默認(rèn)導(dǎo)出 , 起一個(gè)特殊的別名 default
// export {email as default};
模板導(dǎo)入
<!-- 默認(rèn)script在瀏覽器環(huán)境下不支持模塊,需要指定類(lèi)型type="module" -->
<script type="module">
// 1.逐個(gè)(統(tǒng)一)導(dǎo)出 統(tǒng)一導(dǎo)入
import { userName, sex, hello, getHello } from "./modules/m1.js";
console.log(" 1.逐個(gè)(統(tǒng)一)導(dǎo)出 統(tǒng)一導(dǎo)入");
console.log(`**userName: ${userName} , sex: ${sex} **
${getHello(hello, userName)}`);
console.log(" ====================== ");
// 2.別名導(dǎo)出 統(tǒng)一導(dǎo)入
import { n, p, fn } from "./modules/m1.js";
console.log(" 2.別名導(dǎo)出 統(tǒng)一導(dǎo)入: ");
console.log(fn(n, p));
console.log(" ====================== ");
// 3.別名導(dǎo)出 別名導(dǎo)入
import { n as prodName, p as price, fn as prodPrice } from "./modules/m1.js";
console.log(" 3.別名導(dǎo)出 別名導(dǎo)入: ");
console.log(prodPrice(prodName, price));
console.log(" ====================== ");
// 4.默認(rèn)導(dǎo)出 在導(dǎo)入時(shí)重命名
import getName from "./modules/m1.js";
console.log(" 4.默認(rèn)導(dǎo)出 在導(dǎo)入時(shí)重命名:");
const getUserName = new getName("張三, 李四, 王二, 麻子");
console.log(getUserName);
console.log(" ====================== ");
// 5.混合導(dǎo)入 默認(rèn)導(dǎo)出重命名在前 后面跟上模板字面量
import Name, { email } from "./modules/m1.js";
console.log(" 5.混合導(dǎo)入 默認(rèn)導(dǎo)出重命名在前:");
console.log(new Name("張三, 李四"));
console.log(email);
console.log(" ====================== ");
// 6.命名空間導(dǎo)入 把所有模塊封裝在命名空間中 用屬性“.”的方式來(lái)使用
import * as info from "./modules/m1.js";
console.log(" 6.命名空間導(dǎo)入 ");
console.log(info.userName);
console.log(new info.default("李四, 張三"));
</script>
微信掃碼
關(guān)注PHP中文網(wǎng)服務(wù)號(hào)
QQ掃碼
加入技術(shù)交流群
Copyright 2014-2025 http://ipnx.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號(hào)