Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 保持对JSON-API的嵌套http调用与可观察对象之间的关系_Javascript_Angular_Typescript_Rxjs_Json Api - Fatal编程技术网

Javascript 保持对JSON-API的嵌套http调用与可观察对象之间的关系

Javascript 保持对JSON-API的嵌套http调用与可观察对象之间的关系,javascript,angular,typescript,rxjs,json-api,Javascript,Angular,Typescript,Rxjs,Json Api,问题:我在Angular 2项目中使用RXJS。我从JSON-API获取数据。API提供研究和调查问卷。在我们的模型中,一项研究可以“包含”一份或多份问卷。研究有ID,问卷有ID。我想列出所有问卷及其相关研究ID,但我失去了研究ID和问卷对象之间的“链接” getQuestionnaires(studyIds) { console.log(studyIds); // see output [1] this.editableQuestionnaires = []; let studyIdsObs

问题:我在Angular 2项目中使用RXJS。我从JSON-API获取数据。API提供研究和调查问卷。在我们的模型中,一项研究可以“包含”一份或多份问卷。研究有ID,问卷有ID。我想列出所有问卷及其相关研究ID,但我失去了研究ID和问卷对象之间的“链接”

getQuestionnaires(studyIds) {
console.log(studyIds); // see output [1]
this.editableQuestionnaires = [];

let studyIdsObs = Rx.Observable.from(studyIds);

let questShortStream = studyIdsObs.flatMap((id) => {
  return this.apiService.getQuestionnairesOfStudy(id)
});

questShortStream.subscribe(console.log);

let questsAndStudyId = Rx.Observable.zip(studyIdsObs, questShortStream,
  (id, quests) => {
    return {
      studyId: id,
      questionnaires: quests
    }
  })

questsAndStudyId.subscribe(console.log) // see output [2]

let studyIdAndQuestIds = questsAndStudyId.map((obj) => {
  let questIds = [];
  for (let i = 0; i < obj.questionnaires.length; i++) {
    questIds.push(obj.questionnaires[i].id);
  }
  return {
    studyId: obj.studyId,
    questionnaireIds: questIds
  }
});

studyIdAndQuestIds.subscribe(console.log); // see output [3]

let questionnaireIdsObs = studyIdAndQuestIds.flatMap(obj => {
  return Rx.Observable.from(obj.questionnaireIds);
})

questionnaireIdsObs.subscribe(console.log) // see output[4]

let questionnairesObs = questionnaireIdsObs.flatMap(id => this.apiService.getEditableQuestionnaire(id))

questionnairesObs.subscribe(console.log) // see output [5]
示例:假设问卷ID 4、5、6与研究ID 1关联,问卷ID 7、8与研究ID 2关联

研究结果如下(GET:
../api/v1/studies/1
):

问卷如下所示(例如:GET:
../api/v1/inventures/4
):

我想在一个列表中显示所有问卷,并为每个问卷显示与其关联的研究ID,如下所示:

{type: "questionnaires", id: "4", attributes: Object, associatedStudyId: "1"}
{type: "questionnaires", id: "5", attributes: Object, associatedStudyId: "1"}
{type: "questionnaires", id: "6", attributes: Object, associatedStudyId: "1"}
{type: "questionnaires", id: "7", attributes: Object, associatedStudyId: "2"}
{type: "questionnaires", id: "8", attributes: Object, associatedStudyId: "2"}
调用
../api/v1/studies/1/问卷
返回:

[{"type": "questionnaires", "id": "4"},{"type": "questionnaires","id": "5"}]
代码:我已经掌握了我需要的所有组件,我只是不知道如何将研究ID附加到相应的问卷对象上

getQuestionnaires(studyIds) {
console.log(studyIds); // see output [1]
this.editableQuestionnaires = [];

let studyIdsObs = Rx.Observable.from(studyIds);

let questShortStream = studyIdsObs.flatMap((id) => {
  return this.apiService.getQuestionnairesOfStudy(id)
});

questShortStream.subscribe(console.log);

let questsAndStudyId = Rx.Observable.zip(studyIdsObs, questShortStream,
  (id, quests) => {
    return {
      studyId: id,
      questionnaires: quests
    }
  })

questsAndStudyId.subscribe(console.log) // see output [2]

let studyIdAndQuestIds = questsAndStudyId.map((obj) => {
  let questIds = [];
  for (let i = 0; i < obj.questionnaires.length; i++) {
    questIds.push(obj.questionnaires[i].id);
  }
  return {
    studyId: obj.studyId,
    questionnaireIds: questIds
  }
});

studyIdAndQuestIds.subscribe(console.log); // see output [3]

let questionnaireIdsObs = studyIdAndQuestIds.flatMap(obj => {
  return Rx.Observable.from(obj.questionnaireIds);
})

questionnaireIdsObs.subscribe(console.log) // see output[4]

let questionnairesObs = questionnaireIdsObs.flatMap(id => this.apiService.getEditableQuestionnaire(id))

questionnairesObs.subscribe(console.log) // see output [5]
[2]

[3]

[4]

[5]


你能做点像

studyIds.forkJoin(
  studyIds.map(studyId => 
    service.getQuestionaires(studyId).map(questionaires => 
      questionaires.map(questionaire => {
        questionaire.associatedStudyId = studyId;
        return questionaire;
      })
    )
  )
);
[ "1", "2", "3" ]
[ Object, Object ]
[ Object, Object, Object ]
Object { studyId: "1", questionnaires: Array[3] }
Object { studyId: "2", questionnaires: Array[2] }
4
5
6
7
8
Object { type: "questionnaires", id: "4", attributes: Object}
Object { type: "questionnaires", id: "5", attributes: Object}   
Object { type: "questionnaires", id: "6", attributes: Object}
Object { type: "questionnaires", id: "7", attributes: Object}
Object { type: "questionnaires", id: "8", attributes: Object}
studyIds.forkJoin(
  studyIds.map(studyId => 
    service.getQuestionaires(studyId).map(questionaires => 
      questionaires.map(questionaire => {
        questionaire.associatedStudyId = studyId;
        return questionaire;
      })
    )
  )
);