立即执行函数可以创建独立的作用域, 让外部无法访问作用域内部的变量,从而避免变量污染。
当把立即执行函数放在异步函数里面也应该遵循 异步代码执行顺序!!
下面的代码会先打印 aaa ,2秒后再打印 1234
// sleep模拟异步请求
function sleep() {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve('1234');
}, 2000);
});
}
const setMcc = async () => { // async1
let res;
try{
(async function() { // async2
res = await sleep(); // await2
console.log('获取为:', res);
})();
} catch(error) {
console.log(' 获取失败', error)
return error;
}
console.log('aaa')
};
setMcc();
这是因为被包裹的立即执行函数里面(await2)的 await并不会等到执行完,倘若要等整个立即执行函数完,需要在外层再加 await
为了立即执行函数看起来像同步代码顺序那样执行,可以这样做:
下面的代码会2秒后打印 1234 ,再打印 aaa
上述代码改为:
...
const setMcc = async () => { // async1
...
await (async function() { // await1 async2
res = await sleep(); // await2
console.log('获取为:', res);
})();
...
}
...
或者不使用立即执行函数,直接外层的 async await 的一层
// sleep模拟异步请求
function sleep() {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve('1234');
}, 2000);
});
}
const setMcc = async () => { // async1
let res;
try{
res = await sleep(); // await1
console.log('获取为:', res);
} catch(error) {
console.log(' 获取失败', error)
return error;
}
console.log('aaa')
};
setMcc();