为的是化解反弹冥界的难题,ES6(ECMAScript 2015)中追加了 Promise 的基本概念,Promise 是两个构造表达式,能用以建立 Promise 的示例 const p = new Promise(),new 出的 Promise 示例第一类,代表者两个触发器操作形式。
Promise.prototype 上包涵两个 .then() 形式, 每一次 new Promise() 构造表达式获得的实例第一类,都能透过蓝本链的形式出访到 .then() 形式,比如 p.then()。
与此同时.then() 形式用以科水狼获得成功和失利的反弹表达式
p.then(获得成功的反弹表达式,失利的反弹表达式)
p.then(result => { }, error => { })
调用 .then() 形式时,获得成功的反弹表达式是克雷姆斯兰县的、失利的反弹表达式是较旧的。如前所述以内的方法论,他们上看Promise的常用用语。
如前所述反弹表达式按顺序加载文档文本,具体内容标识符如下表所示:
//加载文档1.txtfs.readFile(./files/1.txt, utf8, (err1, r1) => { if (err1) return console.log(err1.message) //加载文档1失取 console, log(r1) //加载文档 1 获得成功 //加载文档2.txt fs.readFile(./files/2.txt, utf8, (err2, r2) => { //诗取文档 2 失利 if (err2) return console.log(err2.message) console.log(r2) //加载文档 2 获得成功 //加载文档3.txt fs.readFile(./files/3.txt, utf8, (err3, r3) => { if (err3) return console.log(err3.message) //加载文档 3失利 console.log(r3) //加载文档 3 获得成功 }) })})
由于 node.js 官方提供的 fs 模块仅支持以反弹表达式的方式加载文档,不支持 Promise 的调用形式。因此,需要先运行如下表所示的命令,安装 then-fs 这个第三方包,从而支持他们如前所述 Promise 的形式加载文档的文本。
npm install then-fs
调用then-fs提供的readFile()形式,能触发器地加载文档的文本,C的返回值是Promise的示例第一类。因此能调用.then()形式为每个Promise触发器操作形式指定获得成功和失利之后的回调表达式。示例标识符如下表所示:
调用 then-fs 提供的 readFile() 形式,能触发器地加载文档的文本,它的返回值是 Promise 的示例第一类。因此能调用 .then() 形式为每个 Promise 触发器操作形式指定获得成功和失利之后的反弹表达式。示例标识符如下表所示:
/★★*如前所述Promise的形式加载文档*/impoik: thenFs from then-fs//注意:.then()中的失利反弹是较旧的,能被省略thenFs.readFile(./files/1.txt,utf8).then(r1=>{console.log(r1)},err1 =>{console.log(err1.message)})thenFs.readFile(./files/2.txt,utf8).then(r2 =>{console.log(r2)},err2 =>{console.log(err2.message)})thenFs.readFile(./files/3.txt,utf8).then(r3 =>{ console.log(r3)},err3 =>{console.log(err3.message)})
注意:上述的标识符无法保证文档的加载次序,需要做进一步的改进!
如果上两个 .then() 形式中返回了两个新的 Promise 示例第一类,则能透过下两个 .then() 继续进行处理。透过 .then() 形式的链式调用,就化解了反弹冥界的难题。
Promise 支持链式调用,从而来化解反弹冥界的难题。示例标识符如下表所示:
thenFs.readFile(./files/1.txt,utf8)// 1.返回值是Promise的示例第一类 .then((r1)=>{// 2.透过.then为第两个Promise示例指定获得成功之后的反弹表达式 console.log(r1) return thenFs.readFile(./files/2.txt,/utf8)// 3.在第两个.then中返回两个新的Promise示例第一类 }) .then((r2)=>{//4.继续调用.then,为上两个.then 的返回值(新的Promise 示例)指定获得成功之后的反弹表达式 console.log(r2) return thenFs.readFile(./files/3.txt,utf8)// 5.在第二个.then中再返回两个新的Promise示例第一类 }) .then((r3)=>{// 6.继续调用.then,为上两个.then 的返回值(新的Promise示例)指定获得成功之后的反弹表达式 console.log(r3) })
在 Promise 的链式操作形式中如果发生了错误,能使用 Promise.prototype.catch 形式进行捕获和处理:
thenFs.readFile(./files/11.txt,utf8)//文档不存在导致加载失利,后面的3个.then 都不执行 .then(r1 =>{ console.log(r1) return thenFs.readFile(./files/2.txt,utf8) }) .then(r2=> { console.log(r2) return thenFs.readFile(./files/3.txt, utf8) }) .then(r3 =>( console.log(r3) }) .catch(err =>{//捕获第1行发生的错误,并输出错误的消息 console.log(err.message) })
Promise.all() 形式会发起并行的 Promise 触发器操作形式,等所有的触发器操作形式全部结束后才会执行下一步的 .then操作形式(等待机制)。示例标识符如下表所示:
//1.定义两个数组,存放3个读文档的触发器操作形式const promiseArr = [ thets.readFile(./files/11.txt,utf8). thenFs.readFile(./files/2.txt,utf8), thenFs.readFile(./files/3.txt,utf8),]// 2.将 Promise的数组,作为Promise.all()的参数Promise.all(promiseArr) .then(([r1,r2,r3])=>{//2.1所有文档加载获得成功(等待机制) console.log(r1, r2, r3) }).catch(err =>{// 2.2捕获 Promise触发器操作形式中的错误 console.log(err.message) })
注意:数组中 Promise 示例的次序,就是最终结果的次序!
Promise.race() 形式会发起并行的 Promise 触发器操作形式,只要任何两个触发器操作形式完成,就立即执行下一步的 .then 操作形式(赛跑机制)。示例标识符如下表所示:
//1.定义两个数组,存放3个读文档的触发器操作形式const promiseArr =[ thenFs.readFile(./files/1.txt, utf8), thenFs.readFile(./files/2.txt, utf8). thenFs.readFile(./files/3.txt, utf8).]// 2.将 Promise 的数组,作为 Promise.race()的参数Pronise.race(promiseArr) .then((result)=>{//2.1只要任何两个触发器操作形式完成,就立即执行获得成功的反弹表达式(赛跑机制) console.log(result) }) .catch(err =>{// 2.2捕获Promise 触发器操作形式中的错误 console.log(err.message) })