Promise第一版本

案例是使用Node.js内置的fs模块[就是文件系统模块,负责读写文件。]来模拟异步操作

const fs = require('fs');
function getFilePath(fpath) {
let p = new Promise(function (resolve, reject) {
fs.readFile(fpath, 'utf-8', (err, dataStr) => {
if (err) return reject(err)
resolve(dataStr)
}) });
return p } let p = getFilePath('./src/main.js');
p.then(
function (data) {
console.log('-----------------' +data + '---------------')
},
function (err) {
console.log(err.message) })

Promise 第二版本

const fs = require('fs');
function getFilePath(fpath) {
return new Promise(
function (resolve, reject) {
fs.readFile(fpath, 'utf-8', (err, dataStr) => {
if (err) return reject(err)
resolve(dataStr)
})
}
) } getFilePath('./src/main.js')
.then(
function (data) {
console.log('-----------------' + data + '---------------')
},
function (err) {
console.log(err.message)
}
)

新的需求: 依次读取 1.txt --> 2.txt --> 3.txt

第一版

const fs = require('fs');
function getFilePath(fpath) {
return new Promise(
function (resolve, reject) {
fs.readFile(fpath, 'utf-8', (err, dataStr) => {
if (err) return reject(err)
resolve(dataStr)
})
}
) } getFilePath('./1.txt')
.then(function (data) {
console.log('-----------------' + data + '---------------') getFilePath('./2.txt')
.then(function (data) {
console.log('-----------------' + data + '---------------') getFilePath('./3.txt')
.then(function (data) {
console.log('-----------------' + data + '---------------') }) })
})

第二版

const fs = require('fs');
function getFilePath(fpath) {
return new Promise(
function (resolve, reject) {
fs.readFile(fpath, 'utf-8', (err, dataStr) => {
if (err) return reject(err)
resolve(dataStr)
})
}
) } getFilePath('./1.txt')
.then(
function (data) {
console.log('-----------------' + data + '---------------')
return getFilePath('./2.txt')
})
.then(
function (data) {
console.log('-----------------' + data + '---------------')
return getFilePath('./3.txt')
})
.then(
function (data) {
console.log('-----------------' + data + '---------------')
})

新需求 捕获过程中的错误 不影响后面的Promise正常执行

const fs = require('fs');
function getFilePath(fpath) {
return new Promise(
function (resolve, reject) {
fs.readFile(fpath, 'utf-8', (err, dataStr) => {
if (err) return reject(err);
resolve(dataStr)
})
}
) } getFilePath('./没有这个文件.txt')
.then(
function (data) {
console.log('-----------------' + data + '---------------')
return getFilePath('./2.txt') }, function (err) {
console.log(err.message)
return getFilePath('./2.txt')
})
.then(
function (data) {
console.log('-----------------' + data + '---------------')
return getFilePath('./3.txt')
})
.then(
function (data) {
console.log('-----------------' + data + '---------------')
})

新需求 后面的执行以来前面的结果,当前面失败立即终止,并捕获错误

const fs = require('fs');
function getFilePath(fpath) {
return new Promise(
function (resolve, reject) {
fs.readFile(fpath, 'utf-8', (err, dataStr) => {
if (err) return reject(err);
resolve(dataStr)
})
}
) } getFilePath('./1.txt')
.then(
function (data) {
console.log('-----------------' + data + '---------------')
return getFilePath('./2.txt') })
.then(
function (data) {
console.log('-----------------' + data + '---------------')
return getFilePath('./22.txt')
})
.then(
function (data) {
console.log('-----------------' + data + '---------------')
return getFilePath('./3.txt')
})
.catch(function (err) {
console.log('【自己】捕获到的错误'+ err.message)
})

上面那样写不太优雅,来个终极版

const fs = require('fs');

function getFilePath(fpath) {
return new Promise(
function (resolve, reject) {
fs.readFile(fpath, 'utf-8', (err, dataStr) => {
if (err) return reject(err);
resolve(dataStr)
})
}
) } Promise.all([getFilePath('./1.txt'), getFilePath('./不存在.txt'), getFilePath('./1.txt')])
.then(datas => {
console.log(datas);
})
.catch(err => {
console.log(err)
})

小结:

  • Vue中的vue-resource(官方已经不推荐使用)和axios都是基于Promise的,完全继承了Promise的特性,看过文档后分分钟可以上手
  • axios中的http请求实现不需要在自己写逻辑了 ,直接调用它的api就可以

最新文章

  1. Go1.7改善了编译速度并且会生成更快的代码
  2. NameError: name 'pip' is not defined
  3. C#中的多文档的使用
  4. android和struts2实现android文件上传
  5. BZOJ1782: [Usaco2010 Feb]slowdown 慢慢游
  6. TEXT文本编辑框3 点击按钮添加文本至文本输入框
  7. JAVA实现数据库数据导入/导出到Excel(POI)
  8. delphi中ShellExecute使用详解
  9. Xilinx ISE14.1用Verilog语言实现一个半加器并测试
  10. Github从注册到上传本地项目详解!!!
  11. 入门Spring ioc
  12. 在go modules里使用go get进行包管理
  13. mysql 8.0 ~ 存储和账户
  14. ArrayList源码分析笔记(jdk1.8)
  15. Effective Java 第三版——52. 明智而审慎地使用重载
  16. RESTful Service API 常见问题解决方案
  17. linux mount
  18. sgu 108 Self-numbers 2
  19. cocos2dx lua 图片去色shader
  20. 002PHP文件处理——文件处理 is_dir mkdir getcwd chdir rmdir

热门文章

  1. CSVHelper 导出CSV 格式
  2. 文字相对于 div 垂直居中
  3. repeater+aspnetpager 组合分页
  4. C# 常用正则验证[转]
  5. 20165219 2017-2018-2 《Java程序设计》第9周学习总结
  6. 【转载】Java资源大全中文版
  7. python3好用的mysql.connector库
  8. 「BZOJ1433」[ZJOI2009] 假期的宿舍(二分图,网络流)
  9. Linux上安装Hadoop集群(CentOS7+hadoop-2.8.3)
  10. 品味ZooKeeper之Watcher机制_2