Rxjs Wait For Previous Execution To Finish
Ok, so I'm new to RxJs and I can't figure out some thing. I need to implement image processing in which the user adds multiple images at a time and for each image, among others, fo
Solution 1:
To achieve the following:
- Thumbnails generation should be done sequentially order is important => use concatMap
- Upload should be done as soon as the thumbnail is generated
- Upload can be done in parallel order is not important => use map
So the final code could be
imageObservable
  .pipe(
    // preserve orders andwaitfor previous observable
    concatMap(generateThumbnail), 
    //map the generate
    map(upload)
  )
  .subscribe();
Note: upload does not wait for the generateThumbnail promise since this should be handled by concatMap itself.
asyncfunctionupload(image) {
  console.log(`[upload] start ${image.image}`);
  returnnewPromise(resolve => {
    setTimeout(() => {
      console.log(`[upload] done ${image.image}`);
      resolve();
    }, 1000);
  });
}
Solution 2:
Do you only want generating thumbnails to be sequential or does generation of a second thumbnail need to wait for upload of the first one to finish as well?
If you don't want to wait for upload, you just need to concat them:
import { of, from, } from'rxjs';
import { concatMap } from'rxjs/operators';
const imageObservable = of(1, 2, 3, 4, 5);
functiongenerateThumbnail(image) {
    console.log(`Generating thumbnail ${image}`);
    returnnewPromise(resolve => {
        setTimeout(() => {
            console.log(`Finished generating thumbnail ${image}`);
            resolve({
                image,
                thumbnail: `This is a thumbnail of image ${image}`
            });
        }, 1500);
    });
}
asyncfunctionupload(imagePromise) {
    const image = await imagePromise;
    console.log('Uploading', image);
    returnnewPromise(resolve => {
        setTimeout(() => {
            console.log('Finished uploading', image);
            resolve();
        }, 1500);
    });
}
// imageObservable.pipe(map(generateThumbnail)).subscribe(upload);
imageObservable.pipe(concatMap(image =>from(generateThumbnail(image)))).subscribe();
concatMap does what you want, and I just made an Observable out of your Promise with from creational operator, which I don't think is needed. But it's usually easier to work with Observables instead of Promises when you use RxJs.
functiongenerateThumbnail(image): Observable<any> {
    console.log(`Generating thumbnail ${image}`);
    returnfrom(
        newPromise(resolve => {
            setTimeout(() => {
                console.log(`Finished generating thumbnail ${image}`);
                resolve({
                    image,
                    thumbnail: `This is a thumbnail of image ${image}`
                });
            }, 1500);
        })
    );
}
Edit: Can you try this?
imageObservable
    .pipe(
        concatMap(image => generateThumbnail(image)),
        concatMap(image => upload(image))
    )
    .subscribe();
Post a Comment for "Rxjs Wait For Previous Execution To Finish"