Function TypeScript函数调用和返回数据

Function TypeScript函数调用和返回数据,function,typescript,ionic-framework,Function,Typescript,Ionic Framework,我正在学习爱奥尼亚,我有以下功能: loadPaper(paper){ this.testFunc(); console.log('questions', this.questions); console.log('paper', paper); this.navCtrl.push(this.loadPaperPage, { paper: paper, questions: this.questions }); } te

我正在学习爱奥尼亚,我有以下功能:

loadPaper(paper){
  this.testFunc();

    console.log('questions', this.questions);
    console.log('paper', paper);

    this.navCtrl.push(this.loadPaperPage, {
        paper: paper,
        questions: this.questions
    });

}

testFunc(){
  this.papersData.getPaper().subscribe(questions => {
    this.questions = questions.questions;
  });
}
我的loadPaper函数调用
testFunc()
,以便使用所需数据设置全局变量。然后我尝试在
控制台.log
打印中使用数据,但控制台报告数据是
未定义的
,而不是我所期望的json数据

除了不起作用之外,我确信这不是最好的解决办法。我确实尝试了我首选的标准解决方案,即从第二个函数返回数据,但失败了


如何解决此问题?

testFunc
不保存订阅,也不返回可观察的。在异步函数中使用
subscribe
,可以将其视为反模式

testFunc
可以修改为返回一个可观察对象,其调用者负责订阅:

testFunc(){
  return this.papersData.getPaper().do(questions => {
    this.questions = questions.questions;
  });
}

loadPaper(paper){
  return this.testFunc().subscribe(questions => {...});
}
如果
this.questions
未在其他任何地方使用,则可能根本不需要
do
。如果
loadPaper
链接到其他地方,它可能会遇到与之前的
testFunc
相同的问题,即返回订阅而不是可观察的

如果
getPaper
返回completed observable,那么尽快切换到promises可能是有益的,特别是因为可以使用
async..Wait

testFunc(){
  return this.papersData.getPaper().toPromise();
}

async loadPaper(paper){
  const questions = await this.testFunc();
  ...
}

testFunc
不保存订阅,也不返回可观察的。在异步函数中使用
subscribe
,可以将其视为反模式

testFunc
可以修改为返回一个可观察对象,其调用者负责订阅:

testFunc(){
  return this.papersData.getPaper().do(questions => {
    this.questions = questions.questions;
  });
}

loadPaper(paper){
  return this.testFunc().subscribe(questions => {...});
}
如果
this.questions
未在其他任何地方使用,则可能根本不需要
do
。如果
loadPaper
链接到其他地方,它可能会遇到与之前的
testFunc
相同的问题,即返回订阅而不是可观察的

如果
getPaper
返回completed observable,那么尽快切换到promises可能是有益的,特别是因为可以使用
async..Wait

testFunc(){
  return this.papersData.getPaper().toPromise();
}

async loadPaper(paper){
  const questions = await this.testFunc();
  ...
}

this.papersData.getPaper().subscribe
订阅可观察的。订阅块中声明的函数称为异步函数,并且仅当可观察对象发出值时才调用。你无法知道可观察物何时发出一个值。因此,它可以是(现在也是)稍后执行
console.log('questions',this.questions)。因此,
this.questions
的值不会在执行时设置

ionViewDidLoad(){
  this.subscription = this.papersData.getPaper().subscribe(questions => {
    this.questions = questions.questions;
    let paper = <whatever>;
    this.loadPaper(paper);
  });
}

ionViewWillUnload(){
  if (this.subscription instanceof Subscription) {
    this.subscription.unsubscribe();
  }
}

loadPaper(paper){

    console.log('questions', this.questions);
    console.log('paper', paper);

    this.navCtrl.push(this.loadPaperPage, {
        paper: paper,
        questions: this.questions
    });

}
ionViewDidLoad(){
this.subscription=this.papersData.getPaper().subscription(问题=>{
this.questions=questions.questions;
让纸=;
这是装载纸(纸);
});
}
ionViewWillUnload(){
if(this.subscription instanceof subscription){
this.subscription.unsubscripte();
}
}
装载纸(纸){
console.log('questions',this.questions);
console.log(“纸”,纸);
this.navCtrl.push(this.loadPaperPage{
纸:纸,
问题:这个
});
}
也许您不希望在加载页面时直接调用loadPaper。然后,您可以调整Observable以等待另一个事件(单击page、mousemove等)

ionViewDidLoad(){
this.subscription=Observalbe.CombineTest(this.papersData.getPaper(),this.clickEvent)。订阅(数据=>{
让问题=数据[0];
点击事件=数据[1];
this.questions=questions.questions;
让纸=;
这是装载纸(纸);
});
}

要在更大的项目中使用javascript/typescript,您必须了解异步(回调/承诺/可观察)是如何工作的。订阅和可观察对象是此.papersData.getPaper()的一部分。订阅订阅可观察对象。订阅块中声明的函数称为异步函数,并且仅当可观察对象发出值时才调用。你无法知道可观察物何时发出一个值。因此,它可以是(现在也是)稍后执行
console.log('questions',this.questions)。因此,
this.questions
的值不会在执行时设置

ionViewDidLoad(){
  this.subscription = this.papersData.getPaper().subscribe(questions => {
    this.questions = questions.questions;
    let paper = <whatever>;
    this.loadPaper(paper);
  });
}

ionViewWillUnload(){
  if (this.subscription instanceof Subscription) {
    this.subscription.unsubscribe();
  }
}

loadPaper(paper){

    console.log('questions', this.questions);
    console.log('paper', paper);

    this.navCtrl.push(this.loadPaperPage, {
        paper: paper,
        questions: this.questions
    });

}
ionViewDidLoad(){
this.subscription=this.papersData.getPaper().subscription(问题=>{
this.questions=questions.questions;
让纸=;
这是装载纸(纸);
});
}
ionViewWillUnload(){
if(this.subscription instanceof subscription){
this.subscription.unsubscripte();
}
}
装载纸(纸){
console.log('questions',this.questions);
console.log(“纸”,纸);
this.navCtrl.push(this.loadPaperPage{
纸:纸,
问题:这个
});
}
也许您不希望在加载页面时直接调用loadPaper。然后,您可以调整Observable以等待另一个事件(单击page、mousemove等)

ionViewDidLoad(){
this.subscription=Observalbe.CombineTest(this.papersData.getPaper(),this.clickEvent)。订阅(数据=>{
让问题=数据[0];
点击事件=数据[1];
this.questions=questions.questions;
让纸=;
这是装载纸(纸);
});
}

要在更大的项目中使用javascript/typescript,您必须了解异步(回调/承诺/可观察)是如何工作的。订阅和可观察内容是。

您也可以共享
getPaper
方法的代码吗?您也可以共享
getPaper
方法的代码吗?