前言
从实战问题中剖析知识点
1. 问题所示
执行vue3数据的时候,终端输出的data如下所示
promise {<pending>}
[[prototype]] : promise
[[promisestate]] : "fulfilled"
[[promiseresult]] : array(13)
截图如下所示:

2. 知识分析
输出的数据是javascript的promise对象的
对于这个数据基本的数据分析如下:
promise {<pending>}:promise对象的初始状态,处于等待状态[[prototype]]: promise:对象的原型链,通过promise构造函数创建的[[promisestate]]: "fulfilled":promise对象的内部状态,已经成功完成[[promiseresult]]: array(13):对象的结果
对于promise的状态有如下:
- pending(待定):promise刚创建时的初始状态
- fulfilled(成功):操作成功完成,promise有了结果
- rejected(失败):操作失败,promise有了失败的原因
promise的结果:当promise状态变为fulfilled时,会有一个对应的结果值,这里是一个包含13个元素的数组
正确处理promise的结果,例如使用.then()和.catch()方法
比如查看输出内容:
mypromise.then(result => console.log(result));
做适当的错误处理:
mypromise
.then(result => {
console.log(result);
})
.catch(error => {
console.error('error:', error);
});
给个示例demo:
function fetchdata() {
return new promise((resolve, reject) => {
// 模拟异步操作
settimeout(() => {
const data = array(13).fill('example data');
resolve(data);
}, 1000);
});
}
// 使用promise
fetchdata()
.then(result => {
console.log('promise fulfilled with result:', result);
})
.catch(error => {
console.error('promise rejected with error:', error);
});
3. 实战
通过实战理解更加透彻
const handleadd = () => {
if (props.formtype === 'detail') return // 禁用“添加危险品”按钮
const row = {
id: undefined,
shipname: undefined,
voyage: undefined,
billnumber: undefined,
boxnumber: undefined,
boxsize: undefined,
boxtype: undefined,
productname: undefined,
hazardouslevel: undefined,
hazardcode: undefined,
isopentoporhigh: undefined,
appointmentid: undefined,
}
row.appointmentid = props.appointmentid
const data = appointmentcommissionapi.getentersitelistbyappointmentid(props.appointmentid)
console.log(data)
// 确保 data 是数组并赋值给 formdata.value.list
const fetcheddata = array.isarray(data) ? data : [];
formdata.value.list = [...formdata.value.list, ...fetcheddata];
formdata.value.list.push(row) // 添加新条目到列表中
console.log('updated list:', formdata.value.list);
}
其中data输出问题所示的内容,那么处理此类问题有如下两种方式
- 使用promise的
.then()方法来处理异步api调用的结果
const handleadd = () => {
if (props.formtype === 'detail') return // 禁用按钮
const row = {
id: undefined,
shipname: undefined,
voyage: undefined,
billnumber: undefined,
boxnumber: undefined,
boxsize: undefined,
boxtype: undefined,
productname: undefined,
hazardouslevel: undefined,
hazardcode: undefined,
isopentoporhigh: undefined,
appointmentid: undefined,
}
row.appointmentid = props.appointmentid
// 调用api并处理结果
appointmentcommissionapi.getentersitelistbyappointmentid(props.appointmentid)
.then(data => {
// 确保 data 是数组并赋值给 formdata.value.list
const fetcheddata = array.isarray(data) ? data : [];
formdata.value.list = [...formdata.value.list, ...fetcheddata];
formdata.value.list.push(row); // 添加新条目到列表中
console.log('updated list:', formdata.value.list);
})
.catch(error => {
console.error('error fetching data:', error);
});
}
- 另一种更现代和清晰的方法是使用
async/await
const handleadd = async () => {
if (props.formtype === 'detail') return // 禁用按钮
const row = {
id: undefined,
shipname: undefined,
voyage: undefined,
billnumber: undefined,
boxnumber: undefined,
boxsize: undefined,
boxtype: undefined,
productname: undefined,
hazardouslevel: undefined,
hazardcode: undefined,
isopentoporhigh: undefined,
appointmentid: undefined,
}
row.appointmentid = props.appointmentid
try {
// 调用api并等待结果
const data = await appointmentcommissionapi.getentersitelistbyappointmentid(props.appointmentid);
// 确保 data 是数组并赋值给 formdata.value.list
const fetcheddata = array.isarray(data) ? data : [];
formdata.value.list = [...formdata.value.list, ...fetcheddata];
formdata.value.list.push(row); // 添加新条目到列表中
console.log('updated list:', formdata.value.list);
} catch (error) {
console.error('error fetching data:', error);
}
}
以上就是在vue3中处理异步api调用并更新表单数据的方法示例的详细内容,更多关于vue3处理异步api并更新数据的资料请关注代码网其它相关文章!
发表评论