认真学习,认真记录,每天都要有进步呀!!!

加油叭!!!


一、回调函数

回调的含义:异步任务里面又嵌套了异步

如图:



没有使用回调之前读取文件,没有办法保证每次执行顺序都是

a--->b--->c

使用回调可以使文件读取顺序是 a--->b--->c

二、Promise(解决回调嵌套的问题)

Promise是一个构造函数

Promise一旦被创建,就开始执行里面的代码

Promise承诺本身不是异步,但是它里面的代码往往封装一个异步任务



这里调用的resolve()实际上就是then方法传递的那个function

使用reject相当于调用了then方法的第二个参数

PromiseAPI代码图示:



用Promise解决如上案例中回调嵌套问题,读取文件顺序依然还是

a--->b--->c

var fs = require('fs')
var p1 = new Promise(function (resolve, reject) {
fs.readFile('./data/a.txt', 'utf8', function (err, data) {
if (err) {
reject(err)
} else {
resolve(data)
}
})
})
var p2 = new Promise(function (resolve, reject) {
fs.readFile('./data/b.txt', 'utf8', function (err, data) {
if (err) {
reject(err)
} else {
resolve(data)
}
})
})
var p3 = new Promise(function (resolve, reject) {
fs.readFile('./data/c.txt', 'utf8', function (err, data) {
if (err) {
reject(err)
} else {
resolve(data)
}
})
})
p1
.then(function (data) {
console.log(data)
// 当 p1 读取成功的时候
// 当前函数中 return 的结果就可以在后面的 then 中 function 接收到
// 当你 return 123 后面就接收到 123
// return 'hello' 后面就接收到 'hello'
// 没有 return 后面收到的就是 undefined
// 上面那些 return 的数据没什么用
// 真正有用的是:我们可以 return 一个 Promise 对象
// 当 return 一个 Promise 对象的时候,后续的 then 中的 方法的第一个参数会作为 p2 的 resolve
//
return p2
}, function (err) {
console.log('读取文件失败了', err)
})
.then(function (data) {
console.log(data)
return p3
})
.then(function (data) {
console.log(data)
console.log('end')
})

封装Promise版本的readFile

var fs = require('fs')

function pReadFile(filePath) {
return new Promise(function (resolve, reject) {
fs.readFile(filePath, 'utf8', function (err, data) {
if (err) {
reject(err)
} else {
resolve(data)
}
})
})
}
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)
})

最新文章

  1. C# List<T> 合并、去重、查找
  2. maven出现 -Dmaven.multiModuleProjectDirectory system propery错误
  3. [Python] Magic editor in Pycharm
  4. Java for LeetCode 155 Min Stack
  5. 关于xcode7编译旧项目崩溃-[UIApplication _runWithMainScene:transitionContext:completion:]
  6. IOS 怎么修改Navigation Bar上的返回按钮文本颜色,箭头颜色以及导航栏按钮的颜色
  7. 常用封装--Date篇--获取格式化的日期对象
  8. CodeForces 712D Memory and Scores
  9. 为Android系统的Application Frameworks层增加硬件访问服务
  10. ng-option小解
  11. Java经典编程题50道之三十八
  12. [Swift]LeetCode701. 二叉搜索树中的插入操作 | Insert into a Binary Search Tree
  13. Redis 哨兵节点之间相互自动发现机制(自动重写哨兵节点的配置文件)
  14. Vue实例:演示input 和 textarea 元素中使用 v-model 实现双向数据绑定
  15. BZOJ1423 : Optimus Prime
  16. vue js库的条件渲染
  17. springboot系列之-logging
  18. 移植BOA服务器到开发板
  19. [转]如何通过 App Store 审核(iOS 开发者经验分享)
  20. http协议以及http1.0和http1.1的区别

热门文章

  1. 部署grafana+telegraf+influxdb 及 配置 jmeter后端监听
  2. 《Design by Contract for Embedded Software》 翻译
  3. C#结构体大小问题
  4. Ant Design Pro:Layout 组件——嵌套布局
  5. Python调用golang
  6. 5、有一行电文,译码规律为: a ——> z b——> y c ——> x. 即把第一个字母变成第26个字母, 第i个字母变成第(26-i+1)个字母, 非字母字符不变
  7. 关于windows上pip安装报错
  8. form enctype="multipart/form-data" ajax 文件上传
  9. js 金钱3位格式化
  10. SSH(七)新的开始