ES6--浅析Promise内部结构 (5)

那么我们来看下面的代码,并且改为promise。

// 回调函数 let fs = require('fs') fs.readFile('./a.txt','utf8',(err,data)=>{ // 往fs.readFile方法传递了第三个为函数的参数 if(err){ console.log(err) return } console.log(data) }) // 改写为Promise let fs = require('fs') function read(filePath,encoding){ return new Promise((resolve,reject)=>{ fs.readFile(filePath,encoding,(err,data)=>{ if(err) reject(err) resolve() }) }) } read('./a.txt','utf8').then((data)=>{ // 在这里则不再需要传回调函数进去,而是采用then来达到链式调用 console.log(data) },(err)=>{ console.log(err) })

这样看好像Promise也没什么优势,那么接下来我们对比一下

// 假设有3个文件 // - 1.txt 文本内容为'2.txt' // - 2.txt 文本内容为'3.txt' // - 3.txt 文本内容为'hello swr' // 用回调函数 fs.readFile('./1.txt','utf8',(err,data)=>{ fs.readFile(data,'utf8',(err,data)=>{ fs.readFile(data,'utf8',(err,data)=>{ console.log(data) // hello swr }) }) }) // 用Promise read('./1.txt','utf8') .then((data)=>{ // 1.如果一个promise执行完后,返回的还是一个promise, // 会把这个promise的执行结果会传递给下一次then中 return read(data,'utf8') }) .then((data)=>{ return read(data,'utf8') }) .then((data)=>{ // 2.如果在then中返回的不是一个promise, // 而是一个普通值,会将这个普通值作为下次then的成功的结果 return data.split('').reverse().join('') }) .then((data)=>{ console.log(data) // rws olleh // 3.如果当前then中失败了,会走下一个then的失败回调 throw new Error('出错') }) .then(null,(err)=>{ console.log(err) // Error:出错 报错了 // 4.如果在then中不返回值,虽然没有显式返回, // 但是默认是返回undefined,是属于普通值,依然会把这个普通值传到 // 下一个then的成功回调中 }) .then((data)=>{ console.log(data) // undefined })

从上面可以看得出,改写为Promise的代码,更好阅读和维护,从用Promise方式可以得出结论:

(1)如果一个promise执行完后,返回的是一个promise,会将这个promise的执行结果传递给下一个then回调成功中;

(2)如果在then中返回的不是一个promise,而是一个普通的值,会将这个普通的值传到下一个then成功回调中;

(3)如果当时then中失败了,会走下一个then的回调失败;

(4)如果then不返回值,但是默认是返回undefined的,属于普通值,会将这个普通值传到下一个then成功回调中。

如果在then中抛出错误,会怎么样呢?

情况1:会被下一个then中的失败回调捕获

// 情景一,会被下一个then中的失败回调捕获 read('./1.txt','utf8') .then((data)=>{ throw new Error('出错了') }) .then(null,(err)=>{ console.log(err) // Error:出错了 报错 })

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpxdwg.html