js高级程序设计(4th)--11章Promise和异步函数杂记

new Promise(() => {}); // 永远的pending状态

Promise进度通知

class TrackablePromise extends Promise {
	constructor(executor) {
		const notifyHandlers = [];
		super((resolve, reject) => {
			return executor(resolve, reject, (status) => {
				console.log(notifyHandlers.length);
				notifyHandlers.map((handler) => handler(status));
			});
		});
		this.notifyHandlers = notifyHandlers;
	}
	notify(notifyHandler) {
		this.notifyHandlers.push(notifyHandler);
		return this;
	}
}

let p = new TrackablePromise((resolve, reject, notify) => {
	function countdown (x) {
		if (x > 0) {
			notify(`${20 * x}% remaining`);
			setTimeout(()=> countdown(x - 1), 1000);
		} else {
			resolve();
		}
	}
	countdown(5);
});
p.notify((x) => setTimeout(console.log, 0, 'progress:', x));
p.then(() => setTimeout(console.log, 0, 'completed'));
// 输出,每行输出间隔约1s
progress: 80% remaining
progress: 60% remaining
progress: 40% remaining
progress: 20% remaining
completed

setTimeout的优先级和Promise的优先级问题,设计eventLoop机制即异步任务中微任务和宏任务的区分(后期补齐)

Promise对象创建后即会执行内部方法

let p = new Promise((resolve) => {console.log(1); setTimeout(() => resolve(2), 2000)});
// output
1

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
Promise执行方法中直接抛出异常不会被外部的(promise对象外面)try/catch捕获,同时也不会进该promise对象的catch()中,只能在内部包try/catch然后出异常时调用reject将其抛至promise对象的catch中

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值