Promise 是什么?(承诺)
Promise 是一种异步流程的控制手段;
回调地狱, 代码难以维护, 第一个的输入是第二个的输入. 比如常用的 ajax 调用, 代码如下:
- $.ajax(
- success(){
- $.ajax(
- success(){
- }
- )
- }
- )
promise 链式调用
可以支持多个并发的请求, 获取并发请求中的数据;
- a().b()// 比如这个 a 执行完了, 执行 b
- ajax()//1
- ajax()//2
可以解决异步的问题, 本身不能说 promise 是异步的 (then 方法是异步的)
promise(承诺) 关键词 resolve 成功 reject 失败 pending 等待
如果一旦 promise 成功了就不能失败, 相反也是一样的; 只有状态是等待的状态时才可以转化状态; 每一个 promise 的实例上都有一个 then 方法, then 方法中有两个参数, 一个参数叫成功的函数, 一个是失败的函数; promise 中发生错误 就会执行失败态.
- let p = new Promise((resolve,reject)=>{// 默认 promise 中的 excutor 是同步执行的.
- resolve('承诺');//resolev 走成功
- reject('没承诺');//reject 走失败
- });
- p.then((value)=>{//value 成功的原因
- console.log('success');
- },(err)=>{//err 失败的原因
- console.log('faile');
- })
用 Promise 链式调用读取文件解决金字塔 demo
金字塔 demo:
- let fs = require('fs');
- fs.readFile('1.txt','utf8',function(err,data){
- if(err)return console.log(err);
- fs.readFile(data,'utf8',function(err,data){
- if(err)return console.log(err);
- console.log(data);
- fs.readFile(data,'utf8',function(err,data){
- if(err)return console.log(err);
- console.log(data);
- })
- })
- })
promise 链式调用
如果返回的是 promise 那么会取这个 promise 的结果, 如过成功会走外层的 promise 的下一个 then 的成功, 将数据传递到成功里;
promise 实现链式调用返回的并不是 this 而是一个新的 promise.
- function read(url) {
- return new Promise((resolve,reject)=>{
- fs.readFile(url, 'utf8', function (err, data) {
- if(err) reject(err);
- resolve(data);
- })
- })
- }
- // 链式调用 -- 前提新建两个文本文档, 分别是 1.txt 和 2.txt; 1.txt 里面写的 2.txt,2.txt 里面写的 222
- read('1.txt').then((data)=>{
- return read(data);// 如果返回了一个新的 promise
- //return 100;// 如果返回的是一个普通值就会走到写一个 then 中的成功回调
- //throw new Error();// 假如成功里面抛出个异常, 会走下一个 then 的失败
- }).then(data=>{
- console.log(data);//222 输出的 2.txt 里面的内容
- },err=>{
- console.log(err);
- }).then(data=>{
- console.log(data,'000');//undefined '000'
- });// 失败之后还可以再 then, 依然会走到成功这里的 then
Promise.all 和 Promise.race 以及 Promise.resole Promise.reject
Promise.all 例子:
Promise.all 方法调用会返回一个新的 promise
- let fs = require('fs');
- function read(url) {
- return new Promise((resolve, reject) => {
- fs.readFile(url, 'utf8', function (err, data) {
- if (err) reject(err);
- resolve(data);
- })
- })
- }
- // 第一种
- // Promise.all([read('1.txt'),read('2.txt')]).then((data)=>{
- // console.log(data);
- // })
- // 第二种
- Promise.all([read('1.txt'),read('2.txt')]).then((r1,r2)=>{
- console.log(r1,r2);
- },err=>{
- console.log(err);
- });
Promise.race 例子:
Promise.race 赛跑 顺序执行不一定, 处理多个请求只取最快的
- let fs = require('fs');
- function read(url) {
- return new Promise((resolve, reject) => {
- fs.readFile(url, 'utf8', function (err, data) {
- if (err) reject(err);
- resolve(data);
- })
- })
- }
- // 如果读取的文件不存在, 就直接走失败了
- Promise.race([read('1.txt'),read('2.txt')]).then((data)=>{
- console.log(data);
- },err=>{
- console.log(err);
- });
Promise 成功失败的例子:
Promise.resolve() 返回一个成功的 promise
Promise.reject() 返回一个失败的 promise
- Promise.resolve('success').then(data=>{
- console.log('data')//success
- })
- Promise.reject('fail').then(null,data=>{// 希望第一个参数不传, 此处的 null 可以忽略掉
- console.log(data);//fail
- })
来源: https://juejin.im/post/5affaebcf265da0b8636845f