2016-04-11 11 views
2

In Ionic 2 die get Funktion für den Zugriff auf localStorage gibt ein Versprechen. Das Problem mit dem folgenden Code ist, dass das headers Objekt zurückgegeben wird, bevor es mit dem Schlüssel Authorization angefügt wurde. Wie kann ich die folgende Funktion so ändern, dass das Objekt headers erst zurückgegeben wird, nachdem das Versprechen aufgelöst wurde.Angular2 synchrone Versprechen

private _createAuthHeaders(): Headers { 
    let headers = new Headers({ 
     'Accept': 'application/json', 
     'Content-Type': 'application/json' 
    }); 
    this.local.get('authToken').then(res=>{ 
     headers.append('Authorization', res); 
    }, err=>{ 
     headers.append('Authorization', ''); 
    }); 
    return headers; 
} 

Antwort

3

Ich würde Ihr Code auf diese Weise Refactoring:

private _createAuthHeaders(): Headers { 
    let headers = new Headers({ 
    'Accept': 'application/json', 
    'Content-Type': 'application/json' 
    }); 
    this.local.get('authToken').then(res=>{ 
    headers.append('Authorization', res); 
    return headers; 
    }, err=>{ 
    headers.append('Authorization', ''); 
    return headers; 
    }); 
} 

und Sie können diese Methode wie folgt verwenden:

this._createAuthHeaders().then(headers => { 
    // do something like setting the headers on the request 
    // and execute it... 
}); 

bearbeiten

Sie versprechen Verkettungs nutzen können um deinen Code sauberer zu machen. Hier ist ein Beispiel:

this._createAuthHeaders().then(headers => { 
    // do something like setting the headers on the request 
    // and execute it... 
    return this.http.get('some url', { headers: headers }).toPromise(); 
}).then(result => { 
    // handle result 
}); 
+0

Auch der Rückgabetyp der Funktion sein sollte '' aber ich wollte nur die Funktion, die 'Headers' Objekt zurückzukehren. Da ich in der Caller-Funktion ein benutzerdefiniertes 'request'-Objekt erstelle, wird der Code überladener, wenn ich ein anderes Versprechen in ihm behandeln muss. –

+0

Die kurze Antwort ist: Sie können nicht ;-) Die längere Antwort ist, dass Sie die Verkettung von Versprechen nutzen können ... Ich aktualisierte meine Antwort mit einem Beispiel für diesen Ansatz –

+0

Vorläufig habe ich das mit dem nativen 'Fenster umgangen .localStorage.getItem ('authToken') 'Funktion, die nur den' String' Typ zurückgibt. Aber ich sollte bei dem Framework bleiben und es irgendwann umgestalten. Vielen Dank. –

Verwandte Themen