一、問題闡述 有的時候我們需要控制非同步函數的執行順序,比如a方法中如果要用到非同步函數b方法的請求結果,就需要進行順序控制,否則a函數先執行就會導致找不到數據直接報錯。 二、方法 1.非同步控制 1.1.async,await等做非同步控制 1.2修改函數放置位置達到非同步控制效果(我遇到的情況無效,但是確 ...
一、問題闡述 有的時候我們需要控制非同步函數的執行順序,比如a方法中如果要用到非同步函數b方法的請求結果,就需要進行順序控制,否則a函數先執行就會導致找不到數據直接報錯。 二、方法
1.非同步控制
1.1.async,await等做非同步控制
1.2修改函數放置位置達到非同步控制效果(我遇到的情況無效,但是確實是一個方法)
2.通過Vue watch監視數據變化,從而達到非同步控制的效果
3.事件驅動編程。
三、方法示例
1.非同步控制
async mounted() {
await this.b();
this.a();
}
async b() {
const response = await axios.get('your-api-url');
this.someData = response.data;
}
2.watch
watch: { dataOfANeed: {//監視a函數需要的數據 immediate: true, deep: true, handler(newV, oldV) { this.a(); }, }, }, 3.事件驅動編程【未驗證,僅作參考】 mounted() {this.b();
},
methods: {
async b() {
const response = await axios.get('your-api-url');
this.someData = response.data;
this.$nextTick(() => {
this.$emit('data-loaded');
});
},
a() {
this.$on('data-loaded', () => {
// 在這裡可以安全地訪問 this.someData,因為它已經被 b 方法非同步更新了
});
}
}
四、實例
訂單實例中,我們需要設置訂單的基礎信息(setOrderBasic()),其中包含下單目標的基本信息(queryByPage()),運行中我們通過Vue DevTools等前端開發工具的幫助,完成整個方法執行順序的控制。
1.賦值時setOrderBasic()由於其內部有值是queryByPage()方法執行完成後才有的,而由於queryByPage()是非同步回調,所以要做非同步控制
【方法1.2】
但是無用
2.通過直接執行setOrderBasic()方法可以看到
除了需要queryByPage的屬性均賦值成功,而沒有的屬性值則為undefined,可見,雖然無值但仍做了賦值操作(undefined)
3.由此改用watch監視lmInfo
【方法2】
當lmInfo有值(發生改變)時,則觸發setOrderBasic方法,至此成功