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中