Promise 有三种状态,进行中(pending),已成功(fulfilled),已失败(rejected);

一旦状态改变,就不会再变,任何时候都可以得到这个结果。Promise对象的状态改变,只有两种可能:从pending变为fulfilled和从pending变为rejected。只要这两种情况发生,状态就凝固了,不会再变了,会一直保持这个结果,这时就称为 resolved(已定型)。如果改变已经发生了,你再对Promise对象添加回调函数,也会立即得到这个结果。这与事件(Event)完全不同,事件的特点是,如果你错过了它,再去监听,是得不到结果的。

Promise 对象的错误具有“冒泡”性质,会一直向后传递,直到被捕获为止。也就是说,错误总是会被下一个catch语句捕获。

所以可以先实例化一个Promise对象,然后在使用 then 方法为Promise对象添加成功或错误的回调函数,但一般只会添加成功的回调函数。然后用catch捕获错误执行错误的回调函数

 const fs = require("fs");
const path = require("path"); function readFile (url){
return new Promise((resolv,reject) => {
fs.readFile(path.join(__dirname,url),"utf8",(err,data) => {
if(err) return reject(err);
resolv(data);
})
})
} readFile("1.txt").then((data) => {
console.log(data+"\n第1个文件");
return readFile("2.txt");
}).then((data) => {
console.log(data+"\n第2个文件");
return readFile("3.txt");
}).then( data => {
console.log(data+"\n第3个文件");
}).catch( err => {
console.log(err.message);
})

使用递归实现

 const fs = require("fs");
const path = require("path");
(function () {
let that = null;
function ReadFile(arr) {
this.i = 0;
this.len = arr.length;
this.arr = arr;
that = this;
} function readFileArrThen(data) {
console.log(`读取第${that.i}个文件:${data}`);
that.i++;
if (that.i < that.len) {
that.readStart();
}
} function readFileArrCath(err) {
console.log(err.message);
that.i++;
if (that.i < that.len) {
that.readStart();
}
} ReadFile.prototype.readFileArr = function() {
return new Promise((resolve, reject) => {
fs.readFile(path.join(__dirname, that.arr[that.i]), "utf8", (err, data) => {
if (err) return reject(err);
resolve(data);
})
})
} ReadFile.prototype.readStart = function () {
that.readFileArr().then(readFileArrThen).catch(readFileArrCath);
} module.exports.ReadFile = ReadFile;
})()

最新文章

  1. $this--&gt;name
  2. *HDU2510 DFS
  3. golang下的grpc
  4. ViewPager的使用小技巧
  5. web应用程序测试方法和测试技术详述
  6. iOS 设置button文字过长而显示省略号的解决办法
  7. AI - Ideas
  8. 【转载】Powershell获取世纪互联Office365中所有用户的OWA时区
  9. Python分析NGINX LOG版本二
  10. java 异常架构图
  11. OpenGL中glRotatef()函数究竟对矩阵做了什么
  12. 中奖概率算法(php 可用于刮刮卡,大转盘等抽奖算法)
  13. thinkinginjava学习笔记04_初始化与清理
  14. POJ 1791 Heavy Transportation(最大生成树)
  15. Java 7 和 Java 8 中的 HashMap原理解析
  16. synchronized和Lock复习
  17. Linux基础:用tcpdump抓包(转)
  18. SpringMVC之单/多文件上传
  19. java注解的简单介绍
  20. 019_nginx upstream中keepalive参数

热门文章

  1. TF-IDF与余弦相似性的应用:找出相似文章
  2. 采用powershell创建project网站集(摘抄自https://www.cnblogs.com/jindahao/p/5855668.html)
  3. iOS8模糊效果UIVisualEffectView的使用
  4. Nginx 0.8.x + PHP 5.2.13(FastCGI)搭建胜过Apache十倍的Web服务器(第6版)
  5. 微信 公众号 小程序 授权 unionid 用户信息 实验总结
  6. golang 时间戳 时间格式化 获取当前时间 timestamp 计算时间差
  7. 在 Windows Server Container 中运行 Azure Storage Emulator(一):能否监听自定义地址?
  8. Spring学习---Spring中利用组件实现从FTP服务器上传/下载文件
  9. gitlab自动备份恢复与卸载
  10. Android studio ocr初级app开发问题汇总(含工程代码)