本文主要是介绍异步遇上立即执行函数,不立即执行了?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
立即执行函数可以创建独立的作用域, 让外部无法访问作用域内部的变量,从而避免变量污染。
当把立即执行函数放在异步函数里面也应该遵循 异步代码执行顺序!!
下面的代码会先打印 aaa ,2秒后再打印 1234
// sleep模拟异步请求
function sleep() {return new Promise((resolve, reject) => {setTimeout(() => {resolve('1234');}, 2000);});}
const setMcc = async () => { // async1let res;try{ (async function() { // async2res = await sleep(); // await2console.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 async2res = await sleep(); // await2console.log('获取为:', res);})();...
}
...
或者不使用立即执行函数,直接外层的 async await 的一层
// sleep模拟异步请求
function sleep() {return new Promise((resolve, reject) => {setTimeout(() => {resolve('1234');}, 2000);});}
const setMcc = async () => { // async1let res;try{ res = await sleep(); // await1console.log('获取为:', res);} catch(error) {console.log(' 获取失败', error)return error;}console.log('aaa')
};
setMcc();
这篇关于异步遇上立即执行函数,不立即执行了?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!