如何将一个函数值传递给另一个函数值 - angular 2 service

时间:2017-10-11 13:35:20

标签: javascript angular observable pass-by-reference subscription

需要帮助,在角度2应用程序中将数据传递给另一个函数

在这个应用程序中,我从服务器获取数据

问题:无法将数据发送到service.ts中的另一个函数。

预期:获取值并在第二个函数中读取它。

请注意:由于它是服务器客户端集成,我没有plunker或jsfiddle。

第一个功能

  getDLFolders() {

    return this.http.get(this.url + '/alfresco/api/-default-/public/cmis/versions/1.1/browser/root/sites/' + this.targetSite + '/documentLibrary/' + this.targetFolder + '?/cmisselector=children&succinct=true&alf_ticket=' + this.ticket)
      .map(res => res.json())
      .subscribe(
        resGetRecords => {

          //get objects from document folders
          let objectGroup = resGetRecords.objects;
          let objectIDs = [];
          for (var i = 0; i < objectGroup.length; i++) {

            //push object ID's from folder
            objectIDs.push(objectGroup[i].object.succinctProperties["cmis:objectId"]);
          }
          return objectIDs;
          //this will return []array with following values
          //5645cf45-9b6c-4ad2-ad18-91d24c31f837;1.0
         //4712dc17-0c9f-439f-8577-0c80e52d7afc;1.0
        }
      );
  }

第二项功能

  getJson() {
   //how to get the getDLFolders function return values
    for (var i = 0; i < objectIDs.length; i++) {
    return this.http.get(this.url + '/alfresco/api/-default-/public/cmis/versions/1.1/browser/root?objectId='+ objectIDs[i] +'&alf_ticket=' + this.ticket)
      .map(res => res.json());
    }
  }

订阅另一个文件

export class UserdashboardComponent implements OnInit {

  details = [];
  records = [];
  errorMsg: string;

  constructor(private _myRecords: AuthService, private _myDocuments: AuthService) { }

  ngOnInit() {
    //get user details, 
    this._myRecords.getPeople()
      .subscribe(
      resGetRecords => {
        // first name, last name
        this.details = resGetRecords;
      },
      resRecordsError => this.errorMsg = resRecordsError
      );

    //get document Libary records of user , 
    this._myDocuments.getJson()
      .subscribe(
      resGetRecords => {
        //debugger;
        // folders
        this.records = resGetRecords;
        console.log(this.records);

      },
      resRecordsError => this.errorMsg = resRecordsError
      );
  }

}

1 个答案:

答案 0 :(得分:1)

您滥用了subscribe方法。它没有return一个值,因为它是asynchronous,而是一个Subscription对象,这里是一个使用示例:

// this returns the Observable<Response> object
httpGet() {
  return this.http.get('url');
}

// lets just print it out for now with 2nd function
secondFunction(data) {
  console.log(data);
}

// code inside 'subscribe' will execute at a later time when you receive 
// the response from the server hence it won't return the value like a normal function
this.httpGet().subscribe(
  (response: Response) => {
    console.log(response); // this will still work
    return response; // this won't work
  }
);

// if you wish to use the response data you need to call the 2nd function from
// within the 'subscribe' method
this.httpGet().subscribe(
  (response: Response) => {
    secondFunction(response); // send data to 2nd function and print it there
  }
);

编辑:

正如所承诺的,我已经写了一些关于如何在Angular 2/4中处理async操作的例子。

这是plunkr link

  • 第一个示例是简单Say hello,其中您在构造函数中subscribe并在按钮上单击时发出值
  • 在第二个例子中我们创建了一个新的发射器,因为plunkr没有让我正确导入Observable而我没有太多时间来写这个,然后我们订阅并监听来自服务器的虚假响应,当它到达时,我们首先从JSON解析它然后提醒它的属性和值来处理它

第二个例子是你应该如何在你的服务中处理服务器响应,有很多现有的例子,比如官方角度页面上的例子:

Tour of Heroes Angular Tutorial

请注意,这是在Angular中处理每个AJAX请求的方式。