Angular 角度2可观测下一个

Angular 角度2可观测下一个,angular,observable,rxjs5,Angular,Observable,Rxjs5,我在试着理解可观察物的用途 在简单的情况下一切正常,但在一个情况下,我想压缩几个图像 我正在使用ng2 img工具 方法压缩图像。这会降低图像的质量 直到它适合作为maxSizeInMB给定的特定文件大小。设置 如果要忽略png的alpha通道,请将ignoreAlpha设置为true 尽管如此,还是要压缩图像(不推荐使用alpha 通道将丢失,生成的图像可能与 原始图像)返回每个给定文件的可观察值, onNext在一切按计划进行时接收一个文件,或者 错误对象,如果出现错误 在我的代码中,我正在

我在试着理解可观察物的用途

在简单的情况下一切正常,但在一个情况下,我想压缩几个图像

我正在使用ng2 img工具

方法压缩图像。这会降低图像的质量 直到它适合作为maxSizeInMB给定的特定文件大小。设置 如果要忽略png的alpha通道,请将ignoreAlpha设置为true 尽管如此,还是要压缩图像(不推荐使用alpha 通道将丢失,生成的图像可能与 原始图像)返回每个给定文件的可观察值, onNext在一切按计划进行时接收一个文件,或者 错误对象,如果出现错误

在我的代码中,我正在执行以下操作:

compressImages(filesToUpload:File[]):Observable<any> {
    if (filesToUpload && filesToUpload.length > 0) {
      return this.ng2ImgToolsService.compress(filesToUpload,GlobalService.MAX_FILE_SIZE_MB).map(response =>  {
        console.log("response is");
        console.log(response)
        return response;
      });
    }
    return Observable.of("no_image").map(response =>  "no_image");

  }


this.imageService.compressImages(filesToUpload).flatMap(result => {
          console.log(result)
          return  this.http.post(...);
        }
      ).catch(UtilsService.handleError);
压缩图像(filesToUpload:File[]):可见{ 如果(filesToUpload&&filesToUpload.length>0){ 返回此.ng2ImgToolsService.compress(filesToUpload,GlobalService.MAX_FILE\u SIZE\u MB).map(响应=>{ 控制台日志(“响应为”); console.log(响应) 返回响应; }); } 返回“无图像”映射的可观测值(响应=>无图像); } this.imageService.compressImages(filesToUpload.flatMap)(结果=>{ console.log(结果) 返回此.http.post(…); } ).catch(UtilsService.handleError);
问题是result只返回1个文件,我知道我应该在某个地方使用
result.next()
,但我不知道如何使用。

问题是您需要订阅该函数,而不是执行另一个映射。当您订阅一个observable时,您隐式地接收到
onNext()
的值作为result

this.imageService.compressImages(filesToUpload).subscribe(
    result => {
        // this contains the value of onNext()
        console.log(result)
        return     this.imageService.compressImages(filesToUpload).subscribe(
    result => {
        // this contains the value of onNext()
        console.log(result)
        return  this.http.post(...);
    }, error => {
        // error
    } this.http.post(...);
    }, error => {
        // error
    }

编辑


如果您想收集流中的所有项目并将其作为一个列表进行操作,可以使用
toList()
如下所示:

this.imageService.compressImages(filesToUpload).toList().subscribe(
    result => {
        // this contains all values from the stream
        console.log(result)
        return  this.http.post(...);
    }, error => {
        // error
    }

谢谢你的回答,但是我如何“循环”所有的next()值呢?@DanyY它还没有为你循环吗?Subscribe在任何东西进入流时应用lambda函数,因此传递的函数将应用于每个onnextuu!!现在事情终于开始变得有意义了,我的情况并没有发生这种情况,因为当我收到一个结果时,我会直接发布到服务器上。但在另一个测试中,它的工作原理和你说的完全一样。有没有一种方法可以等待它们全部完成,然后发布到服务器上?谢谢,
toList()
给了我一个编译错误,因为函数的结果是“可观察的”,但我想到了,我会找到等效的。谢谢你的时间