2017-10-27 1 views
0

Angular4로 서비스 메서드를 구성하여 S3 버킷의 내용을 Observable로 반환하도록 s3.listObjects 호출을 만드는 방법은 무엇입니까?각도 - S3 버킷 내용을 Observable로 가져 오는 방법

여기 내가 현재 노력하고 비참하게 실패하고있어 무엇 : 그냥

public loadFilesFromS3(): Observable<any[]> { 

    const s3 = new AWS.S3(); 
    const params = { 
     Bucket: 'bucket-name', 
     Prefix: 'prefix-name' 
    }; 

    return (
     s3.listObjects(params, (err, data) => { 
     if (err) { 
      throw err; 
     } else { 
      return(data); 
     } 
     }) 
    ) 

    } 

순간이에 완전히 붙어! : - |

+0

사용할 수있는 대상 (http://reactivex.io/rxjs/manual/overview.html#subject)뿐만 아니라 – Debu

+0

나는 데 문제의 이해를 다음과 같이

그럼 당신은 그것을 사용할 수 있습니다 그 의견이 어떻게 도움이되는지. – twosouth

+0

과목은 관찰자와 관찰자의 역할을 수행하므로이를 확인하십시오. https://stackoverflow.com/questions/46953369/two-way-binding-in-angular-without-input/46954594?noredirect=1#comment80878481_46954594 – Debu

답변

0

음, 숙제가 끝나면 나왔습니다.

private tracksListSubject = new BehaviorSubject([]); 
public tracksList$: Observable<Track[]> = this.tracksListSubject.asObservable(); 

public loadTracksFromS3() { 

    console.log('loading tracks from S3...'); 

    this.authenticate(); 

    const s3 = new AWS.S3(); 
    const params = { 
     Bucket: config.AWS_BUCKET_NAME 
    }; 

    s3.listObjects(params, (err, data) => { 
     if (err) { 
     console.log('error!', err); 
     } 

     const raw = data.Contents; 
     const tracks: Track[] = []; 
     raw.forEach((item) => { 
     tracks.push({ 
      id: item.ETag, 
      title: item.Key, 
      url: config.AWS_BASE_URL + item.Key, 
      size: Math.round(item.Size/1024/1024 * 10)/10 
     }) 
     }); 

     console.log(tracks.length, 'tracks loaded'); 
     this.tracksListSubject.next(tracks); 
    }); 

    } 

그런 다음 다른 구성 요소에 난 그냥이 서비스를 주입 할 수 있으며에 tracksList$ 속성에 가입 : 잘 작동하는 것 같다. 서비스 내의 트랙 목록을 수정할 때마다 this.tracksListSubject.next(newTracksList)을 발행합니다.

0

Observable.bindNodeCallback 함수를 사용하여 s3.listObjects 함수를 노드 스타일 콜백에서 Observable을 반환하는 함수로 변환 할 수 있어야합니다.

const listObjectsAsObservable = Observable.bindNodeCallback(s3.listObjects.bind(s3)); 

주 당신이 그 (S3)가 this입니다 그것을 말해, 함수에 S3 객체를 바인드해야 위의 그림과 같이 그. 그렇지 않으면 오류가 발생합니다.

const params = { 
    Bucket: config.AWS_BUCKET_NAME 
}; 
listObjectsAsObservable(params) 
    .subscribe({ 
    next: (response) => console.log(response), 
    error: (err) => console.log(err) 
    }); 
+0

그게 승자처럼 보이지만, 현재이 접근법을 구현하려고 할 때'const listObjectsAsObservable = Observable.bindNodeCallback (s3.listObjects.bind (s3))'줄에'Property 'bindNodeCallback'이 존재하지 않습니다 유형에 '관측 가능'을 입력하십시오. – twosouth

+0

@twosouth'bindNodeCallback' 함수를 가져 왔습니까? 다음 import 문'import '를 추가해보십시오. rxjs/add/observable/bindNodeCallback'; – Joe