如何在AWS JS SDK中为s3.upload()绑定RxJS ^5.3.0 Observable?
解决RxJS 5.3.0与AWS S3 upload方法的绑定问题
嘿,我来帮你搞定这个问题!你当前的思路方向是对的,但有个容易踩的小细节——Observable.bindNodeCallback返回的是一个工厂函数,需要调用它才会触发上传操作并生成Observable。另外,还要确保send方法的上下文正确绑定到ManagedUpload实例(也就是你的s3Upload对象)。
下面给你两种可行的解决方案:
方案一:修正你的原始代码(使用bindNodeCallback)
const s3Config = { Key: logoName, Bucket: bucketName, Body: files[0], ACL: 'public-read' }; const s3Upload = s3.upload(s3Config); // 1. 绑定send方法的上下文到s3Upload实例 // 2. 调用bindNodeCallback返回的函数,生成真正的Observable const upload$ = Observable.bindNodeCallback(s3Upload.send.bind(s3Upload))(); upload$.subscribe( (value) => console.dir('Yeah !', value), (err) => console.dir('上传出错:', err) );
这里的关键是两个点:
- 用
bind(s3Upload)确保send方法执行时的this指向正确的上传实例 - 最后要加
()调用工厂函数,否则不会触发上传流程
方案二:用Promise包装后转成Observable(更直观)
如果你对bindNodeCallback的使用逻辑不太熟悉,把send方法包装成Promise再转成Observable会更易懂:
const s3Config = { Key: logoName, Bucket: bucketName, Body: files[0], ACL: 'public-read' }; const s3Upload = s3.upload(s3Config); // 把send方法包装为标准Promise const uploadPromise = new Promise((resolve, reject) => { s3Upload.send((err, responseData) => { if (err) reject(err); else resolve(responseData); }); }); // RxJS 5.3.0支持用Observable.fromPromise将Promise转为Observable const upload$ = Observable.fromPromise(uploadPromise); upload$.subscribe( (value) => console.dir('上传成功!返回数据:', value), (err) => console.dir('上传失败:', err) );
额外福利:监听上传实时进度
如果你需要跟踪上传的实时进度,可以利用ManagedUpload的httpUploadProgress事件,结合Observable.fromEvent实现:
// 监听上传进度事件 const progress$ = Observable.fromEvent(s3Upload, 'httpUploadProgress'); progress$.subscribe((progress) => { const percent = Math.round((progress.loaded / progress.total) * 100); console.log(`上传进度:${percent}% (${progress.loaded}/${progress.total}字节)`); });
内容的提问来源于stack exchange,提问作者Amila Iddamalgoda
相关产品推荐
相关产品推荐

