Angular 如何使用getObject函数(aws/S3)以角度方式在可观察对象内传递值

Angular 如何使用getObject函数(aws/S3)以角度方式在可观察对象内传递值,angular,observable,aws-sdk,Angular,Observable,Aws Sdk,我尝试学习角度可观察编程(4.4.6): 喜欢做的事情:从AWS/S3存储中获取json文件,保存内容(字符串),在observable中返回内容 employee.service.ts: import { Injectable } from '@angular/core'; import { Observable } from 'rxjs/Observable'; import { BehaviorSubject } from 'rxjs/BehaviorSubject'; import 'r

我尝试学习角度可观察编程(4.4.6):

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

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

}
...
从'@angular/core'导入{Injectable};
从“rxjs/Observable”导入{Observable};
从'rxjs/BehaviorSubject'导入{BehaviorSubject};
导入“rxjs/add/observable/of”;
从“AWS sdk/global”导入*作为AWS;
从“aws sdk/clients/S3”导入*作为S3;
...  
getNotice(userid):可观察{
常量参数={
Bucket:'data.feedback.domain.de',
关键字:“employees/'+userid+'/notice/notice.json”
};
var objectData='';
this.bucket.getObject(参数、函数(错误、数据){
如果(错误){
console.log('获取文件时出错:'+err);
返回;
}
log('成功获取文件:notice.json:',data.Body.toString());
objectData=data.Body.toString();
});
log('objectData:',objectData);
返回可观察的(对象数据);
}
...
在getObject函数中,我接收文件notice.json,在控制台中,我看到保存在notice.json中的字符串

但是使用objectData=data.Body.toString()保存数据不起作用

有什么提示吗,我做错了什么

    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调用是异步/非阻塞的,所以您编写时假设它是一个阻塞代码。

这看起来像是异步错误,您需要粘贴数据,以便从回调函数内部观察到

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

}
从'rxjs'导入{create};
...
getNotice(userid):可观察{
常量参数={
Bucket:'data.feedback.domain.de',
关键字:“employees/'+userid+'/notice/notice.json”
};
var objectData='';
返回create(observer=>{
this.bucket.getObject(参数、函数(错误、数据){
如果(错误){
console.log('获取文件时出错:'+err);
观察者错误(err);
}
log('成功获取文件:notice.json:',data.Body.toString());
objectData=data.Body.toString();
observer.next(objectData);
});
}

为什么决定什么objectData为空?是否尝试在
objectData=data.Body.toString();
行之后粘贴调试器并检查此变量中保存的内容?是的,我这样做了。如果我将结果保存在数组中,它将起作用:
const objectData=new array();…objectData.push(new Notice(data.Body.toString()))是的,谢谢。在回调函数中,我得到了notice.json的正确内容。我没有找到如何修复它的教程或示例。我发现了这样一个提示:
var request=this.bucket.getObject(params);request.on('success',function(response){console.log('Successfully get file:notice.json:',response);return response;});request.send();
这没问题,还提供了内容。代码在服务的函数中。要向调用方提供答案,我可以使用可观察对象。对不起,我的英语是关于创建可观察对象的更多信息,您可以在这里找到