首页 > 解决方案 > 如何在 Angular 中使用 getObject 函数(aws / S3)在可观察对象内传递值

问题描述

我尝试使用 Angular (4.4.6) 学习可观察编程:

喜欢做的事:从 AWS/S3 Storage 获取 json 文件,保存内容(字符串),返回 observable 中的内容。

员工服务.ts:

import { Injectable } from '@angular/core';
import { Observable } from 'rxjs/Observable';
import { BehaviorSubject } from 'rxjs/BehaviorSubject';
import 'rxjs/add/observable/of';
import * as AWS from 'aws-sdk/global';
import * as S3 from 'aws-sdk/clients/s3';

...  

getNotice (userid): Observable<String> {

    const params = {
       Bucket: 'data.feedback.domain.de',
       Key: 'employees/' + userid + '/notice/notice.json'
    };

    var objectData = '';

    this.bucket.getObject(params, function (err, data) {
      if (err) {
        console.log('There was an error getting your files: ' + err);
        return;
      }
      console.log('Successfully get file: notice.json:', data.Body.toString());
      objectData = data.Body.toString();
    });
    console.log('objectData:', objectData);
    return Observable.of(objectData);

}
...

在 getObject 函数中,我收到文件 notice.json,在控制台中,我看到保存在 notice.json 中的字符串。

但是用objectData = data.Body.toString()保存数据是行不通的。

任何提示,我做错了什么?

标签: angularobservableaws-sdk

解决方案


它看起来像异步错误,您需要从回调函数内部将数据粘贴到可观察的

import { create } from 'rxjs';

...

getNotice (userid): Observable<String> {

    const params = {
       Bucket: 'data.feedback.domain.de',
       Key: 'employees/' + userid + '/notice/notice.json'
    };

    var objectData = '';

    return create(observer => { 
      this.bucket.getObject(params, function (err, data) {
        if (err) {
          console.log('There was an error getting your files: ' + err);
          observer.error(err);
        }
        console.log('Successfully get file: notice.json:', data.Body.toString());
        objectData = data.Body.toString();
        observer.next(objectData);
    });

}

推荐阅读