2017-08-13 4 views
3

Ich versuche, ein boolean zurückzukehren, nachdem ein Versprechen löst aber Typoskript gibt eine Fehlermeldung,Typoskript Rückkehr boolean nach Versprechen gelöst

A 'get' accessor must return a value.

mein Code aussieht.

get tokenValid(): boolean { 
    // Check if current time is past access token's expiration 
    this.storage.get('expires_at').then((expiresAt) => { 
     return Date.now() < expiresAt; 
    }).catch((err) => { return false }); 
} 

Dieser Code ist für Ionic 3 Application und der Speicher ist Ionic Storage-Instanz.

+2

Sie können dies nicht tun ... Sie können eine 'Versprechen Rückkehr ' nur durch Rückkehr ' this.storage.get ... 'though. – Gerrit0

+0

@ user2473015 Ich habe normalerweise nicht asynchronen Code in einem get gesehen, sondern der async-Prozess setzt eine Eigenschaft, die der get ruft ... – JGFMK

+1

Und Sie sollten wahrscheinlich nicht einen Getter für eine Sache verwenden, die Nebenwirkungen hat. – Bergi

Antwort

3

Sie können ein Promise zurückgeben, wie dies einen boolean löst:

get tokenValid(): Promise<boolean> { 
    // | 
    // |----- Note this additional return statement. 
    // v 
    return this.storage.get('expires_at') 
    .then((expiresAt) => { 
     return Date.now() < expiresAt; 
    }) 
    .catch((err) => { 
     return false; 
    }); 
} 

Der Code in Ihrer Frage hat nur zwei return-Anweisungen: ein in den then Handler Versprechen und eine innerhalb seiner catch Handler. Wir haben eine dritte Return-Anweisung innerhalb des tokenValid() Accessors hinzugefügt, da der Accessor auch etwas zurückgeben muss. Hier

ist ein funktionierendes Beispiel in the TypeScript playground:

class StorageManager { 

    // stub out storage for the demo 
    private storage = { 
    get: (prop: string): Promise<any> => { 
     return Promise.resolve(Date.now() + 86400000); 
    } 
    }; 

    get tokenValid(): Promise<boolean> { 
    return this.storage.get('expires_at') 
     .then((expiresAt) => { 
     return Date.now() < expiresAt; 
     }) 
     .catch((err) => { 
     return false; 
     }); 
    } 
} 

const manager = new StorageManager(); 
manager.tokenValid.then((result) => { 
    window.alert(result); // true 
}); 
+0

Zusätzliche Informationen zur Frage hinzugefügt. – user2473015

+0

@ user2473015 Ich fürchte, ich weiß nicht, welche zusätzlichen Informationen in dieser Antwort enthalten sind. –

1

Ihre Funktion sein sollte:

get tokenValid(): Promise<Boolean> { 
    return new Promise((resolve, reject) => { 
     this.storage.get('expires_at') 
     .then((expiresAt) => { 
      resolve(Date.now() < expiresAt); 
     }) 
     .catch((err) => { 
      reject(false); 
     }); 
}); 
} 
Verwandte Themen