Errors
Bắt đầu hỗ trợ ở phiên bản:
- SDK: 2.21.0
Hướng dẫn xử lý lỗi
Hầu hết các API trong ZMP SDK đều trả về Promise khi sử dụng, vì vậy bạn có thể lấy kết quả trả về và xử lý lỗi như sau:
1. Sử dụng async/await
kết hợp với try/catch
(khuyến khích)
async/await là một cơ chế hiện đại của JavaScript, được hỗ trợ ở hầu hết các môi trường web hiện nay. Việc sử dụng async/await giúp xử lý các logic bất đồng bộ một cách tuyến tính, tránh rơi vào tình trạng callback hell.
const { userInfo } = await getUserInfo({
autoRequestPermission: true,
});
const { orders } = await fetchOrders({
userId: userInfo.id
})
console.log("Các đơn hàng của người dùng: ", orders);
await
phải được gọi bên trong hàm async
. Ví dụ:
function login() { // ❌ Không thể dùng await trong một hàm thông thường, do JavaScript là non-blocking
await getUserInfo();
}
async function login() { // ✅ Hợp lệ
await getUserInfo();
}
Để xử lý lỗi khi sử dụng async/await
, bạn có thể dùng try/catch
như thông thường:
try {
const { userInfo } = await getUserInfo({
autoRequestPermission: true,
});
const { orders } = await fetchOrders({
userId: userInfo.id,
});
} catch (error) {
if (error instanceof AppError) {
if (error.code === -1401) {
// Người dùng từ chối cung cấp tên và ảnh đại diện
}
// Lỗi khác khi gọi `getUserInfo`
} else {
// Lỗi khác khi gọi `fetchOrders`
}
}
2. Sử dụng các method của Promise như .then()
và .catch()
Cách này có thể sử dụng nếu bạn không muốn chuyển context hiện tại sang async
. Tuy nhiên, nếu cần chain nhiều method, cách này có thể dẫn đến callback hell:
getUserInfo({
autoRequestPermission: true,
}).then(({ userInfo }) => {
fetchOrders({
userId: userInfo.id,
}).then((orders) => {
console.log("Các đơn hàng của người dùng: ", orders);
});
});
Để xử lý lỗi khi sử dụng .then()
, bạn cần dùng .catch()
:
getUserInfo({
autoRequestPermission: true,
}).then(({ userInfo }) => {
fetchOrders({
userId: userInfo.id,
}).then((orders) => {
console.log("Các đơn hàng của người dùng: ", orders);
}).catch((error) => {
// Lỗi khi gọi `fetchOrders`
});
}).catch((error) => {
if (error instanceof AppError) {
if (error.code === -1401) {
// Người dùng từ chối cung cấp tên và ảnh đại diện
}
// Lỗi khác khi gọi `getUserInfo`
}
});
3. Sử dụng callback success
và fail
của ZMP SDK
Tất cả API của ZMP SDK hỗ trợ truyền vào 2 callback đặc biệt là success
và fail
. Callback success
sẽ được gọi khi API thành công và trả về kết quả:
Khi sử dụng các callback này, API sẽ không trả về Promise nữa.
getUserInfo({
autoRequestPermission: true,
success: ({ userInfo }) => {
fetchOrders({
userId: userInfo.id,
success: (orders) => {
console.log("Các đơn hàng của người dùng: ", orders);
},
})
},
});
Để xử lý lỗi, bạn có thể truyền callback fail
tương tự:
getUserInfo({
autoRequestPermission: true,
success: ({ userInfo }) => {
fetchOrders({
userId: userInfo.id,
success: (orders) => {
console.log("Các đơn hàng của người dùng: ", orders);
},
fail: (error) => {
// Lỗi khi gọi `fetchOrders`
},
})
},
fail: (error) => {
if (error.code === -1401) {
// Người dùng từ chối cung cấp tên và ảnh đại diện
}
// Lỗi khác khi gọi `getUserInfo`
},
});
Bảng mô tả các mã lỗi thường gặp
Code | Message | Note |
---|---|---|
-203 | This action reached the limit | Quá giới hạn được gọi của API |
-1400 | Bad request | Tham số truyền vào API không hợp lệ |
-1403 | You don't have permission to call this api | Cần xin cấp quyền tại trang Quản lý ứng dụng |
-1404 | This API is not supported in this Zalo version | Cần cập nhật Zalo để sử dụng các API mới |
-1408 | Request timeout. Please try again later. | |
-2000 | Unknown error. Please try again later. | |
-2001 | Can not decode id. Please check your params again. | Id truyền vào API không hợp lệ |