- 兩個函數(shù)并行執(zhí)行最簡作法
const fun1 = () => {
setTimeout(()=>{// 方便測函數(shù)的執(zhí)行順序
console.log("fun1")
}, 1000)
}
const fun2 = () => {
setTimeout(()=>{
console.log("fun2")
}, 100)
}
setTimeout(fun1)
setTimeout(fun2)
依次打印 fun2 fun1
在函數(shù)內(nèi)部寫計時器是為了便于測函數(shù)的執(zhí)行順序
- 兩個函數(shù)并行執(zhí)行后再去執(zhí)行其他操作
Promise
const fun1 = new Promise((resolve, reject) => {
setTimeout(() => {
console.log('f1')
resolve("1")
}, 1000)
})
const fun2 = new Promise((resolve, reject) => {
setTimeout(() => {
console.log('f2')
reject('2')
}, 800)
})
Promise.all([fun1, fun2]).then(values => {
console.log('resolve', values)
}, values=>{
console.log('reject', values)
})
// 打印順序依次是f2, reject 2, f1
有一個函數(shù)返回了reject, 則 then 的第二個函數(shù)會被調(diào)用,
僅當(dāng)兩個函數(shù)都 resolve 時昏翰,then 的第一個函數(shù)會被調(diào)用,values代表狀態(tài)下的參數(shù)
var p = Promise.all([1,2,3]);
var p2 = Promise.all([1,2,3, Promise.resolve(444)]);
var p3 = Promise.all([1,2,3, Promise.reject(555)]);
setTimeout(function(){
console.log(p);
console.log(p2);
console.log(p3);
});
// 結(jié)果
Promise { [ 1, 2, 3 ] }
Promise { [ 1, 2, 3, 444 ] }
Promise { <rejected> 555 }
// 若去掉setTimeout
Promise { <pending> }
Promise { <pending> }
Promise { <pending> }
在setTimeout 內(nèi)部執(zhí)行的是異步代碼隶糕,可以等到函數(shù)準(zhǔn)備好后尚揣,再獲取執(zhí)行環(huán)境。
Generator
const fun1 = () => {
console.log('fun1')
return '1'
}
const fun2 = () => {
console.log('fun2')
return '2'
}
function* gen(fun1, fun2, fun3) {
yield fun1()
yield fun2()
return 'done!'
}
const g = gen(fun1, fun2)
console.log(g.next()) // fun1 { value: '1', done: false }
接著再執(zhí)行
console.log(g.next()) // fun2 { value: '2', done: false }
若同時打印摆出,則f1, f2均異步朗徊,完成順序因函數(shù)本身而定
async
const fun1 = () => {
console.log('fun1')
return 1
}
const fun2 = () => {
console.log('fun2')
return 2
}
async function handle(fun1, fun2) {
const a = await fun1()
const b = await fun2()
console.log(a + b)
return a
}
handle(fun1, fun2).then(value => {
console.log(value)
})
打印順序:fun1 fun2 3 1
捕獲錯誤
const fun1 = () => {
return new Promise((resolve, reject)=>{
reject("error")
})
// throw 'oh, no'
}
const fun2 = () => {
console.log('fun2')
return 2
}
async function handle(fun1, fun2) {
const a = await fun1()
.catch(err => {
console.log("a",err)
})
const b = await fun2()
console.log(a, b)
return "done"
}
handle(fun1, fun2).then(
value => {
console.log('resolve', value)
},
value => {
console.log('reject', value)
}
)
// 打印順序:
a error
fun2
undefined 2
resolve done
若將a 對應(yīng)函數(shù)后的catch 去掉, 則打印
reject error
錯誤經(jīng)捕獲后,執(zhí)行 then 參數(shù)中第一個回調(diào)函數(shù)