2017-06-02 2 views
2

Ich möchte innerhalb einer Methode warten, bis ein Versprechen zurückgegeben wird.Warten Sie, bis das Versprechen abgeschlossen ist, und geben Sie true oder false zurück.

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 ..... 
} 
...... 

das funktioniert nicht. Die Methode zum Aufrufen dieser loginOffline-Methode möchte nur wissen, ob die Anmeldung erfolgreich war. Ich habe viele Dinge ausprobiert, aber nichts hat geklappt.

Kann jemand helfen. Vielen Dank Cheers

Antwort

5

Sie müssen nur das Versprechen mit einem anderen then verketten. Anruf auf diese Weise:

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

Mehr auf promise chaining

+0

Thx viel das genau funktioniert, wie ich will. –

3

Sie können das Promise Objekt wie folgt:

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); 
}); 
+0

[Dies ist ein Antipattern] (https://stackoverflow.com/questions/23803743/what-ist-the-explicit-promise-construction-antipattern-and-how-do-i-avoid-it) –

+0

@suraj I Ich habe mir den Link angesehen, den Sie mir gegeben haben, und die Antwort bearbeitet. Kannst du bitte einen Blick darauf werfen und mich wissen lassen, ob ich es richtig verstanden habe. Bitte zögern Sie nicht mich zu bearbeiten und zu korrigieren, wenn ich falsch liege. – Dhyey

+0

Sie haben 'resolve (bool)' 'da es kein Parameter mehr ist .. nur' zurück boolean_value' .. –

0

Sie die Lösung finden Sie hier Antwort von @suraj ist die richtige, einfach eine andere 0 verwendenum das zurückgegebene Ergebnis, aber eine Alternative besteht darin, die await/async Schlüsselwörter zu verwenden, um den Code neu zu schreiben.

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 ..... 
} 
...... 

Beachten Sie, dass jede async Funktion automatisch alles konvertiert es in ein Versprechen zurück, so dass Sie async den ganzen Weg bis der Aufrufstruktur verwenden. Oder, wenn aus irgendeinem Grund Sie nicht wollen, um den Anrufer machen async Sie nur then auf das Ergebnis nach wie vor verwenden:

// 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 ..... 
    } 
}); 
...... 
+1

Wie ich in dem anderen Kommentar erwähnt .. Wrapping mit neuen Versprechen jedes Mal ist [ein Anti-Muster] (https://StackOverflow.com/Questions/23803743/what-is-the-explicit-promise-construction-antipattern -und-wie-ich-vermeide-es) –

1

The:

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 
    } 
}) 
Verwandte Themen