2017-11-13 3 views
0

Warum müssen ich die folgenden Kompilierungsfehler mit dieser Typoskript Methode erhalten, die ich schrieb:Typoskript Fehler mit Promise.reject

getFile(path: string): Promise<FileEntry> { 
    return this.file.resolveLocalFilesystemUrl(path) 
    .then(entry => { 
     if (entry.isFile) { 
     return <FileEntry>entry; 
     } else { 
     let err = new FileError(13);   
     err.message = 'input is not a file'; 
     return Promise.reject(err); 
     } 
    }); 
} 

ich den Fehler:

Argument of type '(entry: Entry) => Promise<never> | FileEntry' is not assignable to parameter of type '(value: Entry) => PromiseLike<never>'. Type 'Promise<never> | FileEntry' is not assignable to type 'PromiseLike<never>'. Type 'FileEntry' is not assignable to type 'PromiseLike<never>'. Property 'then' is missing in type 'FileEntry'. 

Die Definition für resolveLocalFilesystemUrl ist als folgt:

resolveLocalFilesystemUrl(fileUrl: string): Promise<Entry>; 

FileEntry eine Unterklasse vonist, daher die gegossene Rückkehr. Der Fehler liegt jedoch bei Promise.reject.

Wenn ich auf die folgende meine ablehnen Linie ändern, es funktioniert:

return Promise.reject<FileEntry>(err); 

Benötige ich Promise.reject(...) zurückzukehren und was ist die korrekte Umsetzung?

Antwort

1

ein Versprechen zurückzukehren Sie eine neue Instanz eines Versprechens erstellen und diese Instanz zurück. Der Konstruktor übernimmt eine Funktion, die die Auflösungs- und Ablehnungsrückrufe empfängt, die Sie aufrufen sollten, wenn Ihre Logik erfolgreich ist oder fehlschlägt.

Damit Ihr Versprechen Ihr Ergebnis "zurückgibt", schreiben Sie nicht return result, sondern rufen Sie resolve(result).

getFile(path: string): Promise<FileEntry> { 
    return new Promise<FileEntry>((resolve, reject) => { 
    // Your logic here. 
    // call resolve() on success 
    // or reject() on failure 
    }); 
} 

Also in Ihrem Fall sollte es wie folgt aussehen:

getFile(path: string): Promise<FileEntry> { 
    return new Promise<FileEntry>((resolve, reject) => { 
    this.file.resolveLocalFilesystemUrl(path) 
    .then(entry => { 
     if (entry.isFile) { 
     resolve(<FileEntry>entry); // Success 
     } else { 
     let err = new FileError(13);   
     err.message = 'input is not a file'; 
     reject(err); // Error 
     } 
    }); 
    }); 
} 

Wenn Sie mehr über Versprechen zum Beispiel lesen lernen wollen hier: https://developers.google.com/web/fundamentals/primers/promises

1

Sie sollten ein aufgelöstes oder abgelehntes Versprechen nicht wirklich innerhalb Ihrer Versprechenskette zurückgeben.

Wenn Sie möchten, um einen Fehler anzuzeigen, sollten Sie nur einen Fehler aus:

else 
    let err = new FileError(13);   
    err.message = 'input is not a file'; 
    throw err;