等到承诺结束并返回true或false

时间:2017-06-02 07:14:04

标签: javascript angular typescript

我想在方法中等待,直到承诺返回。

public loginOffline(username: string, password: string) {
    return this.database.getItem('currentUser', 'login').then(data => {
        this.userLogin = data;
        console.log(username + ' ' + this.userLogin.username + ' ' + password + ' ' + this.userLogin.password);
        if (username === this.userLogin.username && password === this.userLogin.password) {
            return true;
        } else {
            return false;
        }
    }).catch(err => {
        return false;
    });

}

/********* call the method and descide what to do **************/
if (loginOffline('myname', 'mypassword'){
    // Do something.....
} else {
    // Do something else .....
}
......

这不起作用。调用此loginOffline方法的方法只是想知道登录是否成功。我尝试了很多东西,但没有成功。

任何人都可以提供帮助。非常感谢 干杯

4 个答案:

答案 0 :(得分:5)

您只需将承诺与另一个then联系起来。 这样打电话:

loginOffline('myname', 'mypassword').then(result =>{
   if(result){
     //do something
   }else{
     //do something else
   }
})

更多关于promise chaining

答案 1 :(得分:4)

您可以使用Promise对象,如下所示:

public loginOffline(username: string, password: string) {
  return this.database.getItem('currentUser', 'login').then(data => {
      this.userLogin = data;
      console.log(username + ' ' + this.userLogin.username + ' ' + password + ' ' + this.userLogin.password );
      if (username === this.userLogin.username && password === this.userLogin.password) {
        return true;
      } else {
        return false;
      }
    }).catch(err => {
      return false;
    });   
}

loginOffline('myname', 'mypassword').then((result) => {
    if(result) {
      // true was returned
    } else {
      // false was returned
    }
 })

答案 2 :(得分:1)

@suraj的答案是正确的,只需在返回的结果周围使用另一个.then(),但另一种方法是使用await / async关键字来重写代码。

 public async loginOffline(username: string, password: string) {
    try {
      this.userLogin = await this.database.getItem('currentUser', 'login');
    } catch(e) {
      return false;
    }
    console.log(username + ' ' + this.userLogin.username + ' ' + password + ' ' + this.userLogin.password );
    return (
      username === this.userLogin.username &&
      password === this.userLogin.password);
  }

// This code must also be inside a function marked as 'async':
/********* call the method and descide what to do **************/
if(await loginOffline('myname', 'mypassword'){
// Do something.....
} else {
// Do something else .....
}
......

请注意,每个async函数会自动将它返回的任何内容转换为Promise,因此您必须在调用树的整个过程中使用async。或者,如果由于某种原因您不想让调用者async,您可以像以前一样对结果使用then

// If the caller cannot be marked `async`:
/********* call the method and descide what to do **************/
loginOffline('myname', 'mypassword').then(result => {
  if (result) {
  // Do something.....
  } else {
  // Do something else .....
  }
});
......

答案 3 :(得分:0)

你可以在这里找到解决方案:

function GetUserPemission(){
  return new Promise((resolve,reject)=>{
   getdata().then((data)=>{
      if(data){
            resolve(true);
      }else{
        resolve(false);
      }
    }).catch((error)=>{
            resolve(false);
    })
  })
}

function getdata(){
return new Promise((resolve,reject)=>{ setTimeout(()=>{resolve("Data")},100)})
}

GetUserPemission().then((data)=>{
        alert(data);
});