2017-03-29 22 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(); 
} 

上記の例ではObservableが返され、他の目的に使用できます。

0

あなたがbluebirdを使用している場合、あなたはまた、件名を利用して、やや手動で観察可能なを作成する(しかし少なくとも、あなたがもっと良い方法を理解可能性があることができ、この

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

getSession.then(function (session) { 
// session is valid 
}, function (err) { 
// error getting session 
}); 
関連する問題