离子2承诺 - 在执行第二个过程之前完成第一个过程

时间:2017-12-07 13:58:24

标签: angular typescript ionic-framework ionic2

对于我的Ionic 2项目,我有两个功能一个接一个地执行。每个函数都包含一个API调用。我想等到第一个函数完成后执行所有操作才能进入第二个函数。

我遇到的问题是,由于第一个函数需要一些时间才能完成,所以第二个函数在第一个函数完成执行之前执行。

我正在学习如何使用Promise,因为我被告知它可以解决这个问题。 我已经简化了代码,因此更容易理解:

const first = () => {
  self.pspService.post('/api/Conversation/GetPersonalCalendarData',
    {
    }, result => {
      result.Data.forEach(lAppointment => {
      });
    });

  return new Promise((resolve, reject) => {
    resolve();
  });

};

const second = () => {
  self.pspService.post('/api/Conversation/AddPersonalAppointment', {
  }, result => {

  });

  return new Promise((resolve, reject) => {
    resolve();
  });
};

first().then(() => {
  return second();
});

3 个答案:

答案 0 :(得分:1)

您可以将帖子包裹在total

List[Test.type]

或者直接返回POST生成的承诺

List[Serializable]

答案 1 :(得分:0)

使用新的HttpClient和switchMap获取唯一的Observable

firstAndSecond(){
    return self.pspService.post('/api/Conversation/GetPersonalCalendarData')
          .switchMap((data:any)=>{
            //there you have "data", you can use to change the post
            return self.pspService.post('/api/Conversation/AddPersonalAppointment')
           });
}
//In your component
myService.firstAndSecond().subscribe((data2)=>{
    //data2 it's only the data from self.pspService.post
}

答案 2 :(得分:0)

您可以使用 async / 等待来完全处理此类场景。异步函数以 async 关键字为前缀; await 暂停执行,直到完成异步函数返回promise,并从返回的Promise中解除值。

async func(){
    const first = () => {
      self.pspService.post('/api/Conversation/GetPersonalCalendarData',
        {
        }, result => {
          result.Data.forEach(lAppointment => {
          });
        });

      return new Promise((resolve, reject) => {
        resolve();
      });

    };

    const second = () => {
      self.pspService.post('/api/Conversation/AddPersonalAppointment', {
      }, result => {

      });

      return new Promise((resolve, reject) => {
        resolve();
      });
    };

    let firstValue = await first();
    console.log("First Value", firstValue);
    let secondValue = await second();
    console.log("Second Value", secondValue);
  }