代码规范
异步
callback
callback 进行错误处理
// ❌
function callback(err, data) {
console.log(data);
}
// ✅
function callback(err, data) {
if (err) {
console.log(err);
return;
}
console.log(data);
}
promise
Promise 不使用 async
// ❌
new Promise(async (resolve, reject) => {});
// ✅
new Promise((resolve, reject) => {});
Promise 中不使用 return
// ❌
new Promise((resolve, reject) => {
return result;
});
// ✅
new Promise((resolve, reject) => {
resolve(result);
});
reject 抛出 error
// ❌
Promise.reject("An error occurred");
// ✅
Promise.reject(new Error("An error occurred"));
总是使用 catch
// ❌
myPromise().then(() => {});
// ✅
myPromise()
.then(() => {})
.catch(() => {});
await/async
避免 await 结合使用的赋值操作
// ❌
let totalPosts = 0;
async function getPosts(userId) {
const users = [
{ id: 1, posts: 5 },
{ id: 2, posts: 3 },
];
await sleep(Math.random() * 1000);
return users.find((user) => user.id === userId).posts;
}
async function addPosts(userId) {
totalPosts += await getPosts(userId);
}
await Promise.all([addPosts(1), addPosts(2)]);
console.log("Post count:", totalPosts); // 3 or 5
// ✅
let totalPosts = 0;
async function getPosts(userId) {
const users = [
{ id: 1, posts: 5 },
{ id: 2, posts: 3 },
];
await sleep(Math.random() * 1000);
return users.find((user) => user.id === userId).posts;
}
async function addPosts(userId) {
const posts = await getPosts(userId);
totalPosts += posts; // variable is read and immediately updated
}
await Promise.all([addPosts(1), addPosts(2)]);
console.log("Post count:", totalPosts);
避免使用 return await
// 👎
async () => {
try {
return await getUser(userId);
} catch (error) {
// Handle getUser error
}
};
// 👍
async () => {
try {
const user = await getUser(userId);
return user;
} catch (error) {
// Handle getUser error
}
};
循环中不使用 await
// ❌
for (const url of urls) {
const response = await fetch(url);
}
// ✅
const responses = [];
for (const url of urls) {
const response = fetch(url);
responses.push(response);
}
await Promise.all(responses);