2017-10-27 11 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

関連する問題