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() })()
所以在使用自执行函数时,还是使用!比较好