【发布时间】:2022-01-20 12:56:05
【问题描述】:
这是错误:
ERROR TypeError: You provided 'undefined' where a stream was expected. You can provide an Observable, Promise, Array, or Iterable.
这里是代码
publicresourceuploadtos3(event): Observable<any>{
console.log('it got inside the public resource upload to s3 ');
const mediatobeuploaded = event.target.files[0];
return this.http.get(environment.public_generate_presigned_url_resource).pipe(
switchMap((req : any)=>{
const resourceurlprovided = req.uriroot + req.fields.key;
console.log('it got the public presigned url');
let fd = new FormData();
fd.append('acl', req.fields.acl);
fd.append('key', req.fields.key);
fd.append('content-type', req.fields['content-type']);
fd.append('policy', req.fields.policy);
fd.append('x-amz-algorithm', req.fields['x-amz-algorithm']);
fd.append('x-amz-credential', req.fields['x-amz-credential']);
fd.append('x-amz-date', req.fields['x-amz-date']);
fd.append('x-amz-signature', req.fields['x-amz-signature']);
fd.append('file', mediatobeuploaded);
return this.http.post(req.url, fd, {
reportProgress: true,
observe: 'events'
}).pipe(
// answer two https://stackoverflow.com/questions/51176537/angular-6-and-node-js-aws-s3-file-upload-progress-bar
switchMap((events: any)=>{
console.log('it got into the swtich map');
switch(events.type){
case HttpEventType.UploadProgress:
const result = {
progressreport: true,
progress: Math.round(events.loaded / events.total * 100)
};
console.log('it went into upload progress');
return of(result);
case HttpEventType.Response:
const result2 = {
progressreport: false,
resourceurl: resourceurlprovided,
resourcekey: req.fields.key
};
console.log('it went into the response');
return of(result2);
}
}));
}));
}
注意console.log() 语句。最后一个开火的是console.log('it got into the switch map')
这意味着我的 switch map 调用这个错误是因为它期望返回 observables。
但是看看这段代码。
switch(events.type){
case HttpEventType.UploadProgress:
const result = {
progressreport: true,
progress: Math.round(events.loaded / events.total * 100)
};
console.log('it went into upload progress');
return of(result);
case HttpEventType.Response:
const result2 = {
progressreport: false,
resourceurl: resourceurlprovided,
resourcekey: req.fields.key
};
console.log('it went into the response');
return of(result2);
}
}));
return of 语句为什么不满足?我究竟做错了什么?我的理解是,返回是一个可观察的。
我的部分思考过程是,如果两个 switch case 语句不起作用,我需要一个默认语句。但我试过了,我的 IDE 一直对我大喊大叫。所以要么我在做一些完全愚蠢的事情,要么我错过了一些重要的事情。
【问题讨论】:
标签: angular rxjs observable switchmap