目录
一、问题
二、解决方法
三、总结
tiips:如嫌繁琐,直接移步总结即可
一、问题
Promise没有提供直接修改状态的API, 怎么实现Promise的暂停和重启?
二、解决方法
1.思路:
使用 一个变量 isPaused来区分 暂停和重启两种状态
暂停(终止):.then方法里面 返回 new Promise((resolve)=>{}) ,不执行resolve方法,就会让Promise一直处于pending状态
重启: .then方法里面保存返回的result; 重启时 使用 result进行逻辑处理
注:重启优化:为了让Promise能够再次调用.then .catch 方法,需要在暂停的时候保存 resolve方法;重启时调用 resolve方法,让Promise回到 fulFilled状态
2.代码如下:
class Queue {queue = [new Promise((resolve) => { resolve('task1') }),new Promise((resolve) => { resolve('task2') }),new Promise((resolve) => { resolve('task3') })]isPaused = false;result=[]resolveFn=nullrejectFn=nullcurrentPromise=null;start() {this.currentPromise=Promise.all(this.queue).then((result) => {//暂停前保存数据this.result=result;this.do()return this;})}do() {if (this.isPaused) {new Promise((resolve,reject) => {//保留promise resolve或reject的方法this.resolveFn=resolvethis.rejectFn=reject;//返回一个一直pending的状态})} else {this.resolveFn()//处理数据setTimeout(() => {console.log('result', this.result,this.resolveFn,this.resolveFn())}, 4000)}}pause() {this.isPaused = true;return this;}resume() {this.isPaused = false;this.do()return this;}
}
三、总结
1.基本思路:
暂停(终止):.then方法里面 返回 new Promise((resolve)=>{}) ,不执行resolve方法,就会让Promise一直处于pending状态
重启: .then方法里面保存返回的result; 重启时 使用 result进行逻辑处理
2.重启优化:为了让Promise能够再次调用.then .catch 方法,需要在暂停的时候保存 resolve方法;重启时调用 resolve方法,让Promise回到 fulFilled状态
3.借助额外变量存储也是一种好方法呀,不要钻死胡同!!!
我很久都想不明白到底要怎么重启,后来发现重启不就是为了能够使用返回值执行 自己的逻辑吗?把返回值存起来不就可以了
/*
希望对你有帮助!
如有错误,欢迎指正,非常感谢!
*/