如何让一个函数等待另一个函数返回的结果?

时间:2018-10-27 23:17:52

标签: javascript angular typescript ionic3

我有一个名为' updateProfile()'的函数,其条件为 if(emailChangeConfirm),该条件取决于变量' emailChangeConfirm ”,此变量获取另一个名为“ updateEmailAllProcessing()

的函数返回的值。

根本不满足条件“ if(emailChangeConfirm)”,因为编译器没有等待函数“ updateEmailAllProcessing()”返回变量的值“ emailChangeConfirm ”。

我为此使用了 async / await ,但这也无法按我的意愿工作

所需解决方案:

function 'updateProfile()' must wait for the function 'updateEmailAllProcessing()' to get the result in 'emailChangeConfirm' so that i can enter in the condition 'if(emailChangeConfirm)'.

我正在使用打字稿,并且正在使用离子3和角度5的混合应用程序。

 async updateProfile(updatedData : Credentials,tarUser : Credentials)
    {
     // console.log(tarUser,'<<--->>>',updatedData)
     let count : number = undefined;
     let emailChangeConfirm : boolean; 
     if(updatedData.name)
     {
       if(tarUser.name != updatedData.name)
       tarUser.name = updatedData.name;
     else
       count++;
    }
    if(updatedData.email)
     {
       if(tarUser.email != updatedData.email)
         {  
        **emailChangeConfirm = await this.updateEmailAllProcessing();**
        console.log(emailChangeConfirm)
        **if(emailChangeConfirm)
        tarUser.email = updatedData.email;**
    }
    else
    count++;
}
if(updatedData.phoneNo)
{
   if(tarUser.phoneNo != updatedData.phoneNo)
    tarUser.phoneNo = updatedData.phoneNo;
    else
    count++;
}

if(updatedData.photoURL)
{
   if(tarUser.photoURL != updatedData.photoURL)
    tarUser.photoURL = updatedData.photoURL;
    else
    count++;
}

if(count)
this.mesService.presentToast('Nothing Updated!!')
else **if(emailChangeConfirm)**
{
  this.dbServe.editUser(tarUser).then(() =>
  {
      console.log("User Edited Successfully with email change too");
      this.authServ.updateEmail(tarUser.email).then(() => 
      {
          console.log('login email updated');
          this.authServ.logout();
      })
      //this.close();
  })
} 
else
{
  this.dbServe.editUser(tarUser).then(() =>
  {
    console.log("User Edited Successfully with No email change");
    this.close();
  })
 }
}

  **async updateEmailAllProcessing()**
  {
    let result : boolean;
    let alert = this.mesService.emailChangeConfirmation();
    alert.present();
    alert.onDidDismiss((data) => {
    console.log('data->',data);
      if(data)
      {
      let alert1 = this.mesService.passwordPrompt();
      alert1.present();
      alert1.onDidDismiss(data1 => 
        {
          console.log('password->',data1);
          if(data1)
          {
            this.authServ.reauthenticateUser(data1).then(() =>
            {
              console.log('User Reauth Done');
              result = true;
            })
          }
          else
          result = false;
        })
      }
      else
      result = false;
     })
    **return result;**
  }

1 个答案:

答案 0 :(得分:0)

您需要 updateEmailAllProcessing 来返回承诺,以便您可以等待它。并使用回调中的结果来解决promise。

async updateEmailAllProcessing()
{
  return new Promise((resolve, reject) => {
    let result: boolean;
    let alert = this.mesService.emailChangeConfirmation();
    alert.present();
    alert.onDidDismiss((data) => {
      console.log('data->', data);
      if (data) {
        let alert1 = this.mesService.passwordPrompt();
        alert1.present();
        alert1.onDidDismiss(data1 => {
          console.log('password->', data1);
          if (data1) {
            this.authServ.reauthenticateUser(data1).then(() => {
              console.log('User Reauth Done');
              resolve(true);
            })
          }
          else
            resolve(false);
        })
      }
      else
        resolve(false);
    })
  });
}