上一章了解了回调地狱的形成:多层函数互相嵌套,观赏性比较差且不便于后期维护。
使用promise可以解决这个难题
Promise是js中的一个原生对象,是一种异步编程的解决方案,可以替换掉传统的回调函数解决方案。
- Promise构造函数接收一个函数作为参数,我们需要处理的异步任务就卸载该函数体内,该函数的两个参数是resolve,reject。异步任务执行成功时调用resolve函数返回结果,反之调用reject。
- Promise对象的then方法用来接收处理成功时响应的数据,catch方法用来接收处理失败时相应的数据。
- Promise的链式编程可以保证代码的执行顺序,前提是每一次在than做完处理后,一定要return一个Promise对象,这样才能在下一次than时接收到数据
promise的使用:
-
const fs = require("fs") const p = new Promise((resolve, reject) => { fs.readFile("./one.txt", (err, data) => { resolve(data) }) }) p.then(value => { return new Promise((resolve, reject) => { fs.readFile("./two.txt", (err, data) => { resolve([value, data]) }) }) }).then(value => { return new Promise((resolve, reject) => { fs.readFile("./three.txt", (err, data) => { value.push(data) resolve(value) }) }) }).then(value => { let str = value.join("\n") console.log(str) })
使用async、await方法
const fs = require("fs")
function readOne() {
return new Promise((resolve, reject) => {
fs.readFile("./one.txt", (err, data) => {
if (err) {
reject(err)
}
resolve(data)
})
})
}
function readTwo() {
return new Promise((resolve, reject) => {
fs.readFile("./two.txt", (err, data) => {
if (err) {
reject(err)
}
resolve(data)
})
})
}
function readThree() {
return new Promise((resolve, reject) => {
fs.readFile("./three.txt", (err, data) => {
if (err) {
reject(err)
}
resolve(data)
})
})
}
async function test() {
let one = await readOne()
let two = await readTwo()
let three = await readThree()
console.log(one + '\n' + two + '\n' + three)
}
test()