5.9 关于自执行函数使用产生的问题

本文探讨了JavaScript中异步编程的多种实现方式,包括Promise、async/await等,并通过实例展示了如何避免常见错误及提高代码效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、看代码

let a = function (){
   return  new Promise((resolve, reject) => {
        fs.readdir('../case/page', function (err, data) {
            if (err)
                console.log(err)
            resolve(data)
        })
    })
}

当我写一个自执行异步函数调用时报错

(async () => {
    let b = await a()
    console.log(b)
})()

我把方法进行了修改

function a(){
   return  new Promise((resolve, reject) => {
        fs.readdir('../case/page', function (err, data) {
            if (err)
                console.log(err)
            resolve(data)
        })
    })
}

代码便没了报错

2、我将自执行代码进行了修改

!async function (){
    let b = await a()
    console.log(b)
}()

3、继续看代码

//这种写法是会报错,报op不是一个方法
const op = require('../utils/operate')
(async ()=>{
    await op()
})()

修改成下面这样,就能执行
!async function x (){
    await op()
}()

或

!(async () => {
    await op()
})()

再或

!(async function x (){
    await op()
})()

4、接着看代码,下面代码会产生两个问题

let a = async ()=>{
    console.log(1)
}
let b = () => {
    return new Promise((resolve,reject)=>{
        setTimeout(function (){
            console.log(2)
        },5000)
    })

}
let c = function () {
    return new Promise((resolve,reject)=>{
        setTimeout(function (){
            console.log(3)
        },1000)
        })
}
function d(){
    return new Promise((resolve,reject)=>{
            console.log(4)
    })
}

(async ()=>{
    await Promise.race([a(),b(),c(),d()])
})()

// (async ()=>{
//     await a()
//     await b()
//     await c()
//     await d()
// })()

第一个问题,如上,四个promise都会执行,但是如果把注释放开,并且注释掉

(async ()=>{
    await Promise.race([a(),b(),c(),d()])
})()

 只会输出1,2

针对第一个问题,可以对promise部分做些修改,如下

let b = () => {
    return new Promise((resolve,reject)=>{
        resolve(1)
    })
}
let c = () => {
    return new Promise((resolve,reject)=>{
        resolve(2)
    })
}
let d = () => {
    return new Promise((resolve,reject)=>{
        resolve(3)
    })
}

!(async ()=>{
    await b().then(r=>{
        console.log(r)
    })
    await c().then(r=>{
        console.log(r)
    })
    await d().then(r=>{
        console.log(r)
    })
})()

!(async ()=>{
    console.log(await b())
    console.log(await c())
    console.log(await d())
})()

第二个问题,如果把d的代码注释掉,则c的代码会报错

function d(){
    return new Promise((resolve,reject)=>{
            console.log(4)
    })
}

但是当我们把自执行函数前面增加!,即便注释掉了d,就不会报错

如下

!(async ()=>{
    await Promise.race([a(),b(),c(),d()])
})()

或者

!(async ()=>{
    await a()
    await b()
    await c()
    await d()
})()

所以在使用自执行函数时,还是使用!比较好 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值