【问题标题】:how to pass one function values to another in - angular 2 service如何将一个函数值传递给另一个 in - angular 2 服务
【发布时间】:2018-03-23 05:05:41
【问题描述】:

需要帮助,将数据传递给 Angular 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
      );
  }

}

【问题讨论】:

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


    【解决方案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 解析它,然后提醒它的属性和值来处理它

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

    Tour of Heroes Angular Tutorial

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

    【讨论】:

    • 感谢您的回答。我确实花了很多时间来理解这一点,答案看起来很清楚,但是当我用我的代码实现时,还不清楚。最后我最终使用了本地存储。
    • 今天晚些时候我可以帮你搞定,如果你使用 Angular,你绝对需要学习如何使用 Observables。
    猜你喜欢
    • 1970-01-01
    • 2018-09-29
    • 1970-01-01
    • 2019-03-07
    • 1970-01-01
    • 2016-11-24
    • 1970-01-01
    • 2019-07-25
    相关资源
    最近更新 更多