Scope: biến dùng được ở đâu?
Scope là phạm vi mà một biến có thể được truy cập. Biến khai báo bên trong function hoặc block thường chỉ sử dụng được trong khu vực đó.
const baseUrl = "https://elitest.vn"; // Biến này dùng được trong cả file
function printLoginUrl() {
const path = "/login"; // Biến này chỉ tồn tại trong phạm vi của function này
console.log(`${baseUrl}${path}`);
}
printLoginUrl();
// console.log(path); // Lỗi: không tìm thấy biến "path" bên trênbase_url = "https://elitest.vn" # Phạm vi file
def print_login_url() -> None:
path = "/login" # Phạm vi function
print(f"{base_url}{path}")
print_login_url()
# print(path) # Lỗi: path không tồn tại ở đâyModule: chia code thành nhiều file
Khi code lớn dần, chúng ta phải tách ra thành các file riêng. export công khai giá trị từ một file; import sử dụng giá trị đó ở file khác.
File test-data.ts:
export const validUser = { //tiền tố export nghĩa là cho phép các file khác "import" được thằng này
email: "student@elitest.vn",
password: "Aa@123456",
};
export function createEmail(prefix: string): string {
return `${prefix}@elitest.vn`;
}valid_user = {
"email": "student@elitest.vn",
"password": "Aa@123456",
}
def create_email(prefix: str) -> str:
return f"{prefix}@elitest.vn"File login.ts:
import { validUser, createEmail } from "./test-data"; //import 2 biến từ file khác sang
console.log(validUser.email);
console.log(createEmail("student02"));from test_data import create_email, valid_user
print(valid_user["email"])
print(create_email("student02"))./test-datalà đường dẫn tương đối từ file hiện tại.- Tên trong dấu ngoặc nhọn phải khớp với named export.
Xử lý lỗi cơ bản với try/catch
try/catch cho phép code xử lý một lỗi dự kiến thay vì dừng toàn bộ chương trình.
const jsonText = '{ "status": 200 }';
try { //thử
const data = JSON.parse(jsonText); //tạo object từ 1 JSON string
console.log(data.status);
} catch (error) { //nếu lỗi thì nhảy vào đây
console.error("JSON không hợp lệ", error);
}import json
json_text = '{ "status": 200 }'
try:
data = json.loads(json_text)
print(data["status"])
except json.JSONDecodeError as error:
print("JSON không hợp lệ", error)Promise, async và await (xử lý bất đồng bộ)
Một số công việc không hoàn thành ngay: gọi API, mở trang, click rồi chờ điều hướng hoặc đọc file. JavaScript dùng Promise để biểu diễn kết quả sẽ có trong tương lai.
page.goto(), page.click()), hệ thống không trả về kết quả ngay lập tức mà trả về một Promise (Lời hứa). Từ khóa await chính là hành động bạn ngồi chờ cho đến khi shipper giao hàng xong (lời hứa được thực hiện) rồi mới làm bước tiếp theo.Tester mới cần nắm bốn ý:
- Thao tác bất đồng bộ cần thời gian để hoàn thành.
awaitchờ Promise hoàn thành và lấy kết quả.- Function chứa
awaitphải cóasync. - Quên
awaitcó thể làm các bước chạy sai thứ tự.
function orderFood(): Promise<string> {
console.log("Đã đặt một chiếc pizza");
return new Promise((resolve) => {
setTimeout(() => {
resolve("Shipper đã giao pizza");
}, 2000);
});
}
async function haveDinner(): Promise<void> {
console.log("Đang chờ đồ ăn...");
const food = await orderFood();
console.log(food);
console.log("Bắt đầu ăn tối");
}
haveDinner();import asyncio
async def order_food() -> str:
print("Đã đặt một chiếc pizza")
await asyncio.sleep(2)
return "Shipper đã giao pizza"
async def have_dinner() -> None:
print("Đang chờ đồ ăn...")
food = await order_food()
print(food)
print("Bắt đầu ăn tối")
asyncio.run(have_dinner())Promise<string> nghĩa là orderFood() chưa trả món ăn ngay, mà hứa sẽ trả về một chuỗi trong tương lai. setTimeout() mô phỏng hai giây chờ shipper; nhờ await, dòng “Bắt đầu ăn tối” chỉ chạy sau khi pizza đã được giao.
Vì sao quên await gây lỗi?
async function haveDinnerWrong(): Promise<void> {
orderFood(); // Quên await
console.log("Bắt đầu ăn dù pizza chưa được giao");
}
async function haveDinnerCorrectly(): Promise<void> {
await orderFood();
console.log("Pizza đã được giao, bắt đầu ăn");
}
// haveDinnerWrong();
haveDinnerCorrectly();async def have_dinner_wrong() -> None:
order_food() # Quên await
print("Bắt đầu ăn dù pizza chưa được giao")
async def have_dinner_correctly() -> None:
await order_food()
print("Pizza đã được giao, bắt đầu ăn")
# asyncio.run(have_dinner_wrong())
asyncio.run(have_dinner_correctly())await là “đợi bước này hoàn thành rồi mới đi tiếp”. Nó không phải sleep cố định; nó chờ Promise của chính thao tác đó được giải quyết hoặc bị từ chối.Tóm tắt phần 3
- Scope xác định nơi một biến có thể được truy cập.
export/importgiúp chia code thành module.try/catchchỉ nên dùng khi có chiến lược xử lý lỗi rõ ràng.awaitgiúp các thao tác bất đồng bộ chạy đúng thứ tự.




