目录
  1. 1. 异步编程
  2. 2. Promise
回调地狱嵌套

异步编程

可以知道异步操作是不用管前面代码是否执行的,他可以自己干自己的

因此:

var fs = require('fs')

fs.readFile('./data/a.txt', 'utf8', function (err, data) {
if (err) {
// return console.log('读取失败')
// 抛出异常
// 1. 阻止程序的执行
// 2. 把错误消息打印到控制台
throw err
}
console.log(data)
})

fs.readFile('./data/b.txt', 'utf8', function (err, data) {
if (err) {
// return console.log('读取失败')
// 抛出异常
// 1. 阻止程序的执行
// 2. 把错误消息打印到控制台
throw err
}
console.log(data)
})

fs.readFile('./data/c.txt', 'utf8', function (err, data) {
if (err) {
// return console.log('读取失败')
// 抛出异常
// 1. 阻止程序的执行
// 2. 把错误消息打印到控制台
throw err
}
console.log(data)
})

这种方式无法保证每一次都是读取到a>b>c这样的顺序

于是就有了回调地狱嵌套

Promise

为了解决以上编码带来的问题(回调地狱嵌套),所以在EcmaScript6中新增了一个API:promise

var fs = require('fs')

// 创建一个 Promise 容器
// Promise 容器一旦创建,就开始执行里面的代码
// 承诺本身不是异步,仅仅是一个容器,只是在容器中封装异步任务

// 对promise进行封装
function pReadFile(filePath){
return new Promise(function(resolve, reject){
fs.readFile(filePath, 'utf8', function(err, data){
if(err)
reject(err) // 把容器的 Pending 状态变为Rejected
else
resolve(data) // 把容器的 Pending 状态变为Resolved
})
})
}
// 当 p1 读取成功的时候
// 当前函数中 return 的结果就可以在后面的 then 中 function 接收到
// return 'hello' 后面就then接会收到 'hello'
// 没有 return 后面收到的就是 undefined
// 我们可以 return 一个 Promise 对象
// 当 return 一个 Promise 对象的时候,后续的 then 中的 方法的第一个参数会作为 p2 的 resolve

pReadFile('./data/a.txt')
.then(function(data){
console.log(data)
return pReadFile('./data/b.txt')
})
.then(function(data){
console.log(data)
return pReadFile('./data/c.txt')
})
.then(function(data){
console.log(data)
})

此种方法一定是可以保证安装顺序执行的

文章作者: Jachie Xie
文章链接: https://xjc5772.github.io/2020-06/10/%E5%AD%A6%E4%B9%A0/%E5%89%8D%E7%AB%AF%E5%AD%A6%E4%B9%A0/NodeJS/%E5%9B%9E%E8%B0%83%E5%9C%B0%E7%8B%B1%E5%B5%8C%E5%A5%97/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 XJC&Blog
打赏
  • 微信
  • 支付宝

评论