2017-03-29 5 views
3

Kontext:Angular2 Callback vs Promise/Observable

Ich habe AWS Cognito Arbeiten an einer Angular 2 App. Die AWS-Demo verwendet Callbacks, um asynchrone Anfragen zu bearbeiten.

public getSession(callback: CognitoCallback) { 
let cognitoUser: CognitoUser = this.getCurrentUser(); 
let cognitoUtil = this; 
cognitoUser.getSession(function (err, session) { 
    if (err) { 
    let error = new CognitoError(err.name, err.message); 
    callback.cognitoCallback(error, null); 
    return; 
    } 
    if (!session.isValid()) { 
    let error = new CognitoError("SessionInvalid", "Session is not valid"); 
    callback.cognitoCallback(error, session); 
    return; 
    } 
    callback.cognitoCallback(null, session); 
    cognitoUtil.setCurrentUser(cognitoUser); 
    return; 
}); 

}

Ist es möglich, die gleiche Funktionalität mit Versprechen oder Observable zu implementieren?

Vielen Dank im Voraus.

Antwort

1

Sie können auch die Verwendung einer Betreff und erstellen Sie die beobachtbaren etwas manuell (aber zumindest Sie besser verstehen, könnten machen, wie zu tun die Umwandlung).

public getSession(callback: CognitoCallback): Observable<any> { 
    let cognitoUser: CognitoUser = this.getCurrentUser(); 
    let cognitoUtil = this; 


    // You can easily get an Observable from an RxJS subject by calling asObservable(). 
    // more importantly, you can send values/errors to that observable by calling subject.next(valueToSend) or subject.error(errorToSend) 
    let subject = new Subject(); 

    cognitoUser.getSession(function (err, session) { 

    if (err) { 
     let error = new CognitoError(err.name, err.message); 
     //callback.cognitoCallback(error, null); 
     // replace with subject error notification 
     subject.error(error); 
     return; 
    } 
    if (!session.isValid()) { 
     let error = new CognitoError("SessionInvalid", "Session is not valid"); 
     //callback.cognitoCallback(error, session); 
     subject.error(error); 
     return; 
    } 
    //callback.cognitoCallback(null, session); 
    // send the session down through the observable 
    subject.next(session); 
    cognitoUtil.setCurrentUser(cognitoUser); 

    // finish off the observable 
    subject.complete(); 
    return; 
    }); 

    return subject.asObservable(); 
} 

Das obige Beispiel gibt ein Observable zurück, das Sie dann für andere Zwecke verwenden können.

0

Wenn Sie bluebird verwenden, können Sie dies tun

let getSession = Promise.promisify(cognitoUser.getSession); 

getSession.then(function (session) { 
// session is valid 
}, function (err) { 
// error getting session 
}); 
Verwandte Themen