2017-03-29 102 views
3

上下文:Angular2回調vs Promise/Observable

我有AWS認知工作的Angular 2應用程序。 AWS演示使用回調來處理異步請求。

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

}

是否有可能實現與承諾或可觀察到相同的功能?

在此先感謝。

回答

1

你也可以使用一個主題,並創建可觀察到的有所手動(但至少你可以更好地瞭解如何做轉換)。

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(); 
} 

上面的例子將返回一個可觀察,然後就可以用於其他用途。

0

如果使用bluebird,你可以做到這一點

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

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