promise本身不支持进度上报,仅含pending、fulfilled、rejected三种状态;可通过手动调用onprogress回调、封装progresspromise类或结合rxjs observable等方式模拟进度反馈,但不可使用then的第三个参数。

Promise 本身不支持执行进度上报,它只提供 pending、fulfilled、rejected 三种状态,没有内置的“进行中(progress)”阶段。但可以通过其他方式模拟或配合实现进度反馈。
用自定义事件或回调函数传递进度
在 Promise 内部手动调用外部传入的进度回调,是最直接的方式:
function uploadFile(file, onProgress) {
return new Promise((resolve, reject) => {
const xhr = new XMLHttpRequest();
<pre class="brush:php;toolbar:false;"><pre class="brush:php;toolbar:false;">xhr.upload.onprogress = (e) => {
if (e.lengthComputable) {
const percent = Math.round((e.loaded / e.total) * 100);
onProgress(percent); // 主动上报进度
}
};
xhr.onload = () => {
if (xhr.status >= 200 && xhr.status reject(new Error('Network error'));
xhr.open('POST', '/upload');
xhr.send(file);}); }
// 使用
uploadFile(myFile, (percent) => {
console.log(上传中:${percent}%
封装成支持进度的类(如 ProgressPromise)
可以扩展 Promise 行为,创建一个带 onProgress 方法的包装器:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 不替代原生 Promise,而是返回一个增强对象,含
promise和progress订阅能力 - 内部仍用 Promise 构造,进度通过单独的回调队列触发
- 适合需要统一管理多个异步任务进度的场景
用 async/await + 可观察进度的工具(如 RxJS)
RxJS 的 Subject 或 Observable 天然支持多阶段通知,包括进度:
-
Observable可以 emit 多次值(开始、进度、完成、错误) - 配合
toPromise()或firstValueFrom()仍可转为 Promise 使用 - 更灵活,但引入额外依赖
注意:不要误用 Promise.prototype.then 的第三个参数
早期 Promise/A+ 规范曾有 then(onFulfilled, onRejected, onProgress) 提议,但从未被标准采纳。主流环境(包括 Chrome、Node.js)的 then 第三个参数会被忽略,不可靠,应避免使用。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










