在vue中发现一个问题,如果在mounted中同时要调用两个接口,分别是接口a和接口b,但是接口b需要用到接口a的数据,假设这个数据为id。如果按平常方式写就会出现向接口b发送请求的时候,id为空。这就是因为两个接口都是异步请求,我们需要把他们编程同步的。
Promise
Promise 对象用于表示一个异步操作的最终完成 (或失败)及其结果值。
这样使得异步方法可以像同步方法那样返回值:异步方法并不会立即返回最终的值,而是会返回一个 promise,以便在未来某个时候把值交给使用者。
一个 Promise 必然处于以下几种状态之一:
- 待定(pending): 初始状态,既没有被兑现,也没有被拒绝。
- 已兑现(fulfilled): 意味着操作成功完成。
- 已拒绝(rejected): 意味着操作失败。
async和await
async
和await
关键字让我们可以用一种更简洁的方式写出基于Promise
的异步行为。
❗️async函数可能包含0个或者多个await
表达式。await表达式会暂停整个async函数的执行进程并出让其控制权,只有当其等待的基于promise的异步操作被兑现或被拒绝之后才会恢复进程。promise的解决值会被当作该await表达式的返回值。使用async
/ await
关键字就可以在异步代码中使用普通的try
/ catch
代码块。
function settime1(){
console.log("我在return外面")
return new Promise(resolve=>{
setTimeout(function(){
console.log("正在进行中...")
resolve('resolved');
},5000)
})
}
function add(){
let a = 1
let b = 1
// console.log(a+b)
return a+b
}
async function result(){
const r1 = await settime1() // await通过promise暂停了线程,等待运行完毕
console.log(r1)
const r2 = add()
console.log(r2)
}
result()
总结
在我们平常写接口的时候,最好还是用async/await 配合promise进行封装,不然就会导致一开始提出的问题。