採用Promis結合async await即可,案例如下
// 需求,先執行完畢異步say方法,再執行異步run方法
// 方法一:
function q1() {
return new Promise((resolve) => {
setTimeout(() => {
resolve("異步1");
}, 1000)
})
}
function q2() {
return new Promise((resolve) => {
setTimeout(() => {
resolve("異步2");
}, 1000)
})
}
// (async function(){
// console.log("第一次開始")
// const res = await q1();
// console.log("第一次:",res);
// console.log("第二次開始")
// const res2=await q2();
// console.log("第二次:",res2);
// })()
/* 可以直接改用await q()去調用,而不用自執行函數嗎?
答: 這樣不行的,因爲await必須是在async函數內部的,如果使用await q()就相當於不是把await寫在async裏面了 */
// 可以改成這樣(推薦)
const fn = async ()=> {
console.log("第一次開始")
const res = await q1();
console.log("第一次:", res);
console.log("第二次開始")
const res2 = await q2();
console.log("第二次:", res2);
}
fn()
//方法二(推薦):這種寫法比較明朗
function q1(){
return new Promise((resolve)=>{
setTimeout(()=>{
resolve("你好,異步1");
},1000)
})
}
function q2(){
return new Promise((resolve)=>{
setTimeout(()=>{
resolve("你好,異步2");
},1000)
})
}
var o1={
say:async ()=>{
console.log('say方法:');
const res = await q1();
console.log(res);
},
run:async function(){
console.log('run方法:');
const res = await q2();
console.log(res);
}
}
// o1.say()
// o1.run()
//這種調用不是依次,打印:say方法,run方法,你好,異步1,你好,異步2
// 正確的姿勢:
var fn=async function(){
await o1.say();
await o1.run();
}
fn();//正確打印:say方法,你好,異步1,run方法,你好,異步2