JS promise

1 目的: 为了解决回调地狱

setTimeout(() => {
  console.log('买菜');
}, 1000);

setTimeout(() => {
  console.log('洗菜');
}, 1000);

setTimeout(() => {
  console.log('炒菜');
}, 1000);


setTimeout(() => {
    console.log("买菜");
    setTimeout(() => {
        console.log("洗菜");
        setTimeout(() => {
            console.log("炒菜");
        }, 1000);
    }, 1000);
}, 1000);

2 promise结构

  new Promise(function (resolve, reject) {
	//  resolve("赢取白富美");
	reject("凉快去吧");
  }).then(
	(value) => {  console.log(value);  },
	(value) => {  console.log(value);  }
  );

如果成功 resolve(value) 执行then里的第一个函数并传递value值
如果失败 reject(error)  执行then里的第二个函数并传递error值

如果function里失败了reject(), then里必须写全两个函数,若只写第一个,会找不到reject对应的第二个函数,
--程序报错❌ Uncaught (in promise) step2失败--
但可以写成then(null,()=>{})

3 链式调用then

通常都是: 成功则继续,失败停止
完整写法 
let p = new Promise((resolve, reject) => {
	resolve("step1");//第1步
});

p.then(
	() => {
		if (1) return "step2成功";//第2步
		else return Promise.reject("step2失败");
	},
	(error) => {
		return Promise.reject(error);
	}
)
.then(
	() => {
		if (1) return "step3成功";//第3步
		else return Promise.reject("step3失败");
	},
	(error) => {
		return Promise.reject(error);
	}
)
.then(
	(data) => {
		console.log(data);//第4步
	},
	(error) => {
		console.log(error);
	}
);
/*完整写法有个缺点,比如下面这个例子 */
p.then(
	() => {
		if (0) return "step2成功";
		else return Promise.reject("step2失败");//第2步
	},
	(error) => {
		return Promise.reject(error);
	}
)
.then(
	() => {
		if (0) return "step3成功";
		else return Promise.reject("step3失败");
	},
	(error) => {
		return Promise.reject(error);//第3步
	}
)
.then(
	(data) => {
		console.log(data);
	},
	(error) => {
		console.log(error);//第4步
	}
);


简单写法,推荐
let p = new Promise((resolve, reject) => {
	resolve("step1");//第1步
});

p.then(() => {
	if (0) return "step2成功";
	else return Promise.reject("step2失败");//第2步
})
.then(() => {
	if (0) return "step3成功";
	else return Promise.reject("step3失败");
})
.then(
	(data) => {
		console.log(data);
	},
	(error) => {
		console.log(error);//第3步
	}
);

如果想实现这样的流程: step1 => step2失败 => step3成功, 同样可以简单写法
let p = new Promise((resolve, reject) => {
	resolve("step1");//第1步
});

p.then(() => {
	if (0) return "step2成功";
	else return Promise.reject("step2失败");//第2步
})
.then(
	null,
	() => {
	if (1) return "step3成功";//第3步
	else return Promise.reject("step3失败");
})
.then(
	(data) => {
		console.log(data);//第4步
	},
	(error) => {
		console.log(error);
	}
);

4 链式调用的中断

在上面链式调用的简单写法实际用到了链式调用的中断

let p = new Promise((resolve, reject) => {
    resolve("step1");//第1步
});

p.then((data) => {
    console.log(data);
	if(0)
		return "step2成功"
	else
	    //中断下面的Promise的链式调用,利用了下一个then没有对于()=>{}造成中断
	    return Promise.reject("step2失败");//第2步
})
.then(() => {
	console.log("step3");
})
.then(
	(data) => {
		console.log(data);
	},
	(error) => {
		console.log(error);//第3步
	}
);

在Promise中使用throw抛出异常,也会改变此Promise的状态,将其PromiseState改变为rejected,PromiseResult改变为抛出的异常。
即: throw "step2失败" === return Promise.reject("step2失败");

p.then((data) => {
    console.log(data);
	if(0)
		return "step2成功"
	else
	    throw "step2失败"
})
...

5 catch与finally

我们写链式调用.then的时候,最后必须写处理函数
.then(
	(data) => {
		console.log(data);
	},
	(error) => {
		console.log(error);//第3步
	}
);
如果没有,即最后的then是(()=>return Promise.reject("step2失败");),会报
Uncaught (in promise) step2失败


catch(callback)是then(null,callback)的别名,指定Promise失败时的回调
例如:
.then(
	null,
	(error) => {
		console.log(error);//第3步
	}
);
等价于
.catch(
	(error) => {
		console.log(error);//第3步
	}
)

finally( 操作语句 )不管成功还是失败都会执行操纵语句,与error回调无关
.finally(
	console.log("结束")
)

6 Promise静态方法

then catch finally是实例方法

Promise静态方法:

1 Promise.resolve  将对象转化成成功态Promise
例如:
Promise.resolve('成功了')
等价于
new Promise((resolve)=>{ resolve('成功了') })

2 Promise.reject  将对象转化成成功态Promise
例如:
Promise.reject('失败了')
等价于
new Promise((resolve,reject)=>{ reject('失败了') })

3 Promise.all  将多个Promise实例包装成一个新的Promise
var p = Promise.all([p1,p2,p3])
如果p1不是Promise,内部会调用Promise.resolve 进行转换

p.then()
如果[p1,p2,p3]都成功,执行then的第一个回调,否则执行then的第二个回调
then((valueall)=>{})中valueall=[value1,value2,value3]

4 Promise.race  返回最先完成的那个Promise
var p =  Promise.all([p1,p2,p3])

7 then的返回值是promise对象

具体只看then里你写的return是什么
1.回调函数结果为非promise时, 状态为成功fulfilled(就是resolved),返回值为该值

//req.status == 200
myPromise.then(
  function(value) {return 'sss'},
  function(error) {}
);
或
//req.status ! 200
myPromise.then(
  function(value) {},
  function(error) {return 'sss'}
);

结果都是:
1.  [[PromiseState]]: "fulfilled"
2.  [[PromiseResult]]: "sss"

2.回调结果为promise,看这个promise

//req.status == 200
 let p = myPromise.then(
 function (value) { return Promise.resolve('cheng')  },
 function (error) { return Promise.reject('shibai')  }
 )
 p.catch(error=>{})
结果:
1.  [[PromiseState]]: "fulfilled"
2.  [[PromiseResult]]: "cheng"

//req.status != 200
 let p = myPromise.then(
 function (value) { return Promise.resolve('cheng')  },
 function (error) { return Promise.reject('shibai')  }
 )
 p.catch(error=>{})
结果:
1.  [[PromiseState]]: "reject"
2.  [[PromiseResult]]: "shibai"

//req.status == 200
 let p = myPromise.then(
 function (value) { return Promise.reject('cheng')  },
 function (error) { return Promise.reject('shibai')  }
 )
 p.catch(error=>{})
结果:
1.  [[PromiseState]]: "reject"
2.  [[PromiseResult]]: "cheng"
posted @ 2022-02-23 23:04  波吉国王  阅读(81)  评论(0编辑  收藏  举报