背景:異步回調或者異步promise的方式調用給參數deviceInfo賦值,然後再通過console日誌輸出,打印的參數的值爲空,該如何處理?
相關代碼:
<script>
import push from "@service.push";
import device from '@system.device';
const injectRef = Object.getPrototypeOf(global) || global;
// injection regeneratorRuntime
injectRef.regeneratorRuntime = require('@babel/runtime/regenerator');
module.exports = {
data: {
deviceInfo: ''
},
onCreate() {
this.testAsync();
console.log("this.$def.data:", this.$def.data);
},
async testAsync() {
try {
let res = await device.getInfo();
console.info("get device id " + JSON.stringify(res.data));
this.$def.data.deviceInfo = res.data
} catch (e) {
console.log("get device id error " + e.code);
}
},
onDestroy() {
console.info("Application onDestroy");
},
dataApp: {
localeData: {}
}
};
</script>
運行效果:
原因及解決方案:
異步方法的回調方法是異步返回的,調用該方法後,立刻打印該方法中的值,此時異步方法還未執行完成,就會導致後面打印的值爲空。可以加50ms的延時待異步方法返回結果後再去執行後面的代碼。
示例代碼:
<script>
import push from "@service.push";
import device from '@system.device';
const injectRef = Object.getPrototypeOf(global) || global;
// injection regeneratorRuntime
injectRef.regeneratorRuntime = require('@babel/runtime/regenerator');
module.exports = {
data: {
deviceInfo: ''
},
onCreate() {
this.testAsync();
setTimeout(() => {
console.log("this.$def.data:", this.$def.data);
}, 50);
},
async testAsync() {
try {
let res = await device.getInfo();
console.info("get device id " + JSON.stringify(res.data));
this.$def.data.deviceInfo = res.data
} catch (e) {
console.log("get device id error " + e.code);
}
},
onDestroy() {
console.info("Application onDestroy");
},
dataApp: {
localeData: {}
}
};
</script>
運行效果:
欲瞭解更多更全技術文章,歡迎訪問https://developer.huawei.com/consumer/cn/forum/?ha_source=zzh