异步函数执行顺序有问题吗? (角度和Firestore)

时间:2019-10-28 14:37:07

标签: angular typescript asynchronous google-cloud-firestore

对于我的功能执行顺序有一个小问题。

我希望它按照放置的顺序执行,但是由于它们是对Firestore的读取调用,因此它们不同步,因此它们同时执行。

getListData() {
  this.acceptedSource();
  this.pendingSource();
  this.availableSource();
}

// pending is nearly identical to acceptedSource
acceptedSource() {
  this.repService.getMyAcceptedRelations(this.mySubcollection).subscribe(result => {
      if (result && result.length >= 1) {
        this.listData_current = [];
        result.forEach(user => {
          this.listData_current.push({
            //userdata
          });
        })
        this.listData_current = new MatTableDataSource(this.listData_current); // <= important value
      } else {
        //fallback
      }
    });
  }

availableSource() {
  this.repService.getAllCompanyApprenticesOrInstructors().subscribe(result => {
      if (result && result.length >= 1) {
        this.listData_company = [];
        console.log(this.listData_current.data)             // undefined because it triggers
        console.log(this.listData_pendingVerification.data) // before accepted and pending..
        result.forEach(user => {
          let counter = 0;
          // ... do stuff

这3个函数的功能相似,但出于查询原因,我不想将它们组合为一个。

我想要的是 availableSource()触发最后一个,以便它可以访问在acceptedSource()和endingSource()中定义的MatTableSource.data值,但是由于某些原因,availableSource()总是首先触发。

我尝试使用:

//1.
setTimeout(this.availableSource,1000);

//2.
await Promise.all([this.acceptedSource(), this.pendingSource()]).then(() => {
this.availableSource();
);

//3.
await Promise.all([this.acceptedSource(), this.pendingSource()]);
this.availableSource();

//4.
async function acceptedSource() {}
async function pendingSource() {}
async getListData() {
  await this.acceptedSource();
  await this.pendingSource();
  this.availableSource();
}

//5.
acceptedSource().then(() {
  pendingSource().then(() {
    availableSource();
  })
})

最好的可能性是,如果像nr.3这样的东西并行执行前两个函数,然后在两个函数都完成后再执行第三个函数。

0 个答案:

没有答案