actions
trong Vuex là không đồng bộ. Cách duy nhất để cho chức năng gọi (người khởi xướng hành động) biết rằng một hành động đã hoàn tất - là trả lại một Lời hứa và giải quyết nó sau.
Dưới đây là một ví dụ: myAction
trả về a Promise
, thực hiện cuộc gọi http và giải quyết hoặc từ chối cuộc gọi Promise
sau - tất cả không đồng bộ
actions: {
myAction(context, data) {
return new Promise((resolve, reject) => {
// Do something here... lets say, a http call using vue-resource
this.$http("/api/something").then(response => {
// http success, call the mutator and change something in state
resolve(response); // Let the calling function know that http is done. You may send some data back
}, error => {
// http failed, let the calling function know that action did not work out
reject(error);
})
})
}
}
Bây giờ, khi thành phần Vue của bạn bắt đầu myAction
, nó sẽ nhận được đối tượng Promise này và có thể biết liệu nó có thành công hay không. Dưới đây là một số mã mẫu cho thành phần Vue:
export default {
mounted: function() {
// This component just got created. Lets fetch some data here using an action
this.$store.dispatch("myAction").then(response => {
console.log("Got some data, now lets show something in this component")
}, error => {
console.error("Got nothing from server. Prompt user to check internet connection and try again")
})
}
}
Như bạn có thể thấy ở trên, rất có lợi cho actions
việc trả lại a Promise
. Mặt khác, không có cách nào để người khởi xướng hành động biết điều gì đang xảy ra và khi mọi thứ đủ ổn định để hiển thị một cái gì đó trên giao diện người dùng.
Và một lưu ý cuối cùng liên quan mutators
- như bạn đã chỉ ra, chúng là đồng bộ. Họ thay đổi công cụ trong state
, và thường được gọi từ actions
. Không cần phải trộn Promises
với mutators
, như phần actions
xử lý phần đó.
Chỉnh sửa: Quan điểm của tôi về chu trình Vuex của luồng dữ liệu đơn hướng:
Nếu bạn truy cập dữ liệu như this.$store.state["your data key"]
trong các thành phần của mình, thì luồng dữ liệu là một hướng.
Lời hứa từ hành động chỉ để cho thành phần biết rằng hành động đó đã hoàn tất.
Thành phần có thể lấy dữ liệu từ chức năng giải quyết lời hứa trong ví dụ trên (không phải là một hướng, do đó không được đề xuất) hoặc trực tiếp từ $store.state["your data key"]
đó là đơn hướng và tuân theo vòng đời dữ liệu vuex.
Đoạn trên giả định rằng trình biến đổi của bạn sử dụng Vue.set(state, "your data key", http_data)
, sau khi cuộc gọi http được hoàn thành trong hành động của bạn.