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
方法的代码吗?