Как передать значение внутри наблюдаемой с помощью функции getObject (aws / S3) в Angular - PullRequest
0 голосов
/ 11 июня 2018

Я пытаюсь изучить наблюдаемое программирование с помощью Angular (4.4.6):

Как это сделать: получить файл json из хранилища AWS / S3, сохранить содержимое (строку), вернуть содержимое в наблюдаемое.

employee.service.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 я получаю файл note.json, а в консоли вижу строку, сохраненную в note.json.

Но сохранение данных с помощью objectData = data.Body.toString () не работает.

Любой намек, что я делаю неправильно?

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

это похоже на асинхронную ошибку, вам нужно вставить данные для наблюдения изнутри вашей функции обратного вызова

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);
    });

}
0 голосов
/ 11 июня 2018
    var objectData = '';
// Following is an asychronous/non-blocking code so callback called after the response is returned from S3 but execution goes to next line immediately.
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();
});
// Following will be executed even before the S3 returns the response so you must see following console log before console.log('Successfully get file: notice.json:', data.Body.toString());
console.log('objectData:', objectData);
return Observable.of(objectData);

Я поместил ответ в виде встроенных комментариев в коде, в основном вызов s3 является асинхронным / неблокирующим, поэтому вы написали, предполагая, что это блокирующий код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...