Node里面的异步和promise对象
1.异步的例子
for (var i = 0; i < 3; i++) {
setTimeout(() => {
console.log(i)
}, 100)
}
//输出结果为3个3
2.for循环改造异步
用自执行函数解决
fs.readdir(path, (err, data) => {
if (err) {
console.log(err)
return
}
(function getDir(i) {
if (i === data.length) {
console.log(dir)
return
}
fs.stat(path + '/' + data[i], (err, stats) => {
if (stats.isDirectory()) {
dir.push(data[i])
}
getDir(i + 1)
})
})(0)
})
用promise和await ,async解决
第一个方法为异步请求成功后的方法,第二个方法为异步请求失败后的方法
01
async function isDir(path) {
return new Promise((resolve, resject) => {
fs.stat(path, (err, stat) => {
if (err) {
console.log(err)
resject(err)
return
}
if (stat.isDirectory()) {
resolve(true)
} else {
resolve(false)
}
})
})
}
//2.获取wwwrrot看i面的所有资源,循环遍历
function main() {
let dir = []
var path = './wwwroot'
fs.readdir(path,async (err, data) => {
if (err) {
console.log(err)
return
}
for (var i = 0; i < data.length; i++) {
if (await isDir(path + '/' + data[i])) {
dir.push(data[i])
}
}
console.log(dir)
})
}
main()
02
async function test() {
return new Promise((resolve, reject) => {
setTimeout(() => {
var name = 'zhangsan'
resolve(name)
}, 1000)
})
}
async function main() {
var data = await test()
console.log(data)//zahngsan
}
main()
注
- async和await必须配套使用
- await的就近函数才使用await
- promise里面的resolve方法可以拿到异步里面的数据