我是TypeScript(甚至JavaScript)和Angular 6的新手。我必须检索一个可观察的值,将其传递给func faceIndexNoFacesSearch() {
let rekognition = AWSRekognition.default()
let faceRequest = AWSRekognitionSearchFacesByImageRequest()
do {
let image = AWSRekognitionImage()
image?.s3Object = AWSRekognitionS3Object()
image?.s3Object?.bucket = "us-east-1-bucket"
image?.s3Object?.name = "ms-2.jpg"
faceRequest!.image = image
faceRequest!.collectionId = "MyCollectionID"
rekognition.searchFaces(byImage: faceRequest!).continueWith { (response) -> Any? in
XCTAssertNil(response.error)
XCTAssertNotNil(response.result)
if let result = response.result {
XCTAssertNotNil(result.faceMatches)
}
return nil
}.waitUntilFinished()
} catch {
print("exception")
}
}
并处理响应。
我无法正确执行此操作。由于return在这里HttpClient.post
,因此以下内容无法编译。但是我如何正确呢?
Observable<Observable<string>>
我试图将第二个映射refreshTokenCall: Observable<string> = null;
refreshToken(): Observable<string> {
if (!this.refreshTokenCall) {
// Here is the error: Type 'Observable<Observable<string>>' is not assignable to type 'Observable<string>'.
// Type 'Observable<string>' is not assignable to type 'string'. [2322]
this.refreshTokenCall = this.getToken().pipe(
map(token => {
console.log("try refresh")
return this.http.post<Token>(AuthService.REFRESH_TOKEN_URL, JSON.stringify({token: token})).pipe(
map(data => data.token),
shareReplay(),
tap(token => {
console.log("save token after refresh");
this.saveToken(token);
}),
finalize(() => this.refreshTokenCall = null)
);
})
);
} // if
return this.refreshTokenCall;
放入第一个映射map(data => data.token)
,但是参数pipe
的类型为data
。至少在语法上起作用的是用Observable<Token>
替换第一个map
。我认为然后我在documentation about switchMap
switchMap停止从较早发出的内部Observable中发射项目,并开始从新的内部Observable发射项目。
我希望switchMap
条件能够捕获所有后续调用。但是不知何故,我的Observable管道未处理。日志条目不会出现。
所以我在这里做错了吗?