将数据从一个函数分配给另一个函数

Posted

技术标签:

【中文标题】将数据从一个函数分配给另一个函数【英文标题】:Assign Data From One Function To Another 【发布时间】:2021-12-18 02:11:16 【问题描述】:

我正在使用TypeScript 中的服务检索数据库数据,并在全局变量中分配数据,如下所示:

parentMenu: any[] = []; //Global var

LoadParentMenu() 
   this.menuService.getParentMenu().subscribe(result => this.parentMenu = result); //Assigning value here


LoadChildMenu() 
   console.log(this.parentMenu); //Willing to use the global variable in the second function

我知道,可以按如下方式调用第一个函数中的第二个函数,该函数运行良好但不符合我的目的:

LoadParentMenu() 
   this.LoadChildMenu(result); //Passing data in the second function

但我的要求是从两个服务中获取数据,将它们绑定到一个全局数组变量,最后在另一种方法中使用它们(实际上是第三种方法)。我尝试按如下方式在控制台中返回 undefined

parentMenu: any[] = []; //Global var 1
childMenu: any[] = []; //Global var 2

LoadParentMenu() 
   this.menuService.getParentMenu().subscribe(result => this.parentMenu = result); //Assigning value here


LoadChildMenu() 
   this.menuService.getParentMenu().subscribe(result => this.childMenu = result); //Assigning value here


LoadThirdFunc() 
   console.log(this.parentMenu);
   console.log(this.childMenu);

在第三个函数中,我需要通过以下两个全局变量进行更改:

const mergeById = (array1, array2) =>
array1.map(parent => (
  ...parent,
  childMenu: array2.filter((child) => child && (child.parentMenu === parent.menuNo))
    .map(child => child && child.menuName)
));

var result = mergeById(array1, array2)
  .filter(x => x.childMenu && x.childMenu.length > 0);

有什么合适或简单的方法可以做到以上几点吗?

【问题讨论】:

【参考方案1】:

它返回 undefined 因为 typescript 逐行执行,console.log 在从服务器获取数据之前被调用。 您可以将这两个请求合二为一,然后只有当两个请求数据都可用时才会解决

const promises = [];
promises.push(this.menuService.getParentMenu());
promises.push(this.menuService.getParentMenu());
Promise.all(promises).then(responselist=>
//call any function of your choice, responselist will be an array of two results 
// of your services
)
//if you are using angular then you can do something like this
import Observable from 'rxjs/Rx';
const reqs: Observable<any>[] = [];
reqs.push(this.menuService.getParentMenu());
reqs.push(this.menuService.getParentMenu());
Observable.forkJoin(reqs).subscribe(responseList => 
this.parentMenu = responseList[0];
this.childMenu = responseList[1];
//Or you loop through responselist
responseList.map((res,index))
);

【讨论】:

Observable 成功了。非常感谢@Danish Dullu。你能再推荐一件事吗? 是的,我很乐意【参考方案2】:

在我看来这将是 observables 的完美用途,如果这不改变数据,shareReplay 可以很好地用于不再触发 http-requests(假设它们是 http-requests...)

服务:

menus$ = forkJoin([this.LoadParentMenu(), this.LoadChildMenu()]).pipe(shareReplay(1))

forkJoin 并行运行这些请求,并返回一个包含 2 项数据的数组,就像在伪中一样:

[loadParentMenuResultHere, loadChildMenuResultHere]

现在您可以在任何需要的地方订阅 menus$,我喜欢 async 管道,因为它也会为您取消订阅,所以如果可能的话,我建议您这样做。

如果您甚至想默认执行您的第三个功能,您也可以将其链接到那里,并且您已经拥有一个符合您要求的结构化数组,因此如下所示:

menus$ = forkJoin([this.LoadParentMenu(), this.LoadChildMenu()]).pipe(
  map( /** do your magic here and return the data structure you want! **/ )
  shareReplay(1)
);

【讨论】:

以上是关于将数据从一个函数分配给另一个函数的主要内容,如果未能解决你的问题,请参考以下文章

将 Future 类型化结果从函数分配给 Flutter Widget 中的变量

将函数分配给变量

将 Lambda 函数分配给 serverless.yml 中的特定 VPC ID

将 C++ 成员函数分配给 C 函数指针

将JavaScript函数分配给变量的效果[重复]

如何将一个功能的小计分配给另一个功能?