Angular - روش مناسب برای انتظار کشیدن روی Observables مرتبشده و زنجیرهای کردن نتایج


من یک آرایه از مشاهدات دارم که باید به ترتیب اجرا شوند، اما نیاز دارم مجموعهای از مشاهدات را به صورت سرد (بدون اشتراکگذاری) بازگردانم تا بتوان زنجیرهسازی اضافی انجام داد.

const work = [observable1, observable2, observable3];

اگر من return concat(...work) کنم و چیزی تلاش کند از آن زنجیرهسازی کند work$.pipe(switchMap(() => ...))، switchMap برای هر observable داخل concat اجرا خواهد شد - ۳ بار.

من دنبال چیزی مشابه forkJoin هستم که forkJoin(...work).pipe(switchMap(() => ...)) باشد، جایی که switchMap تنها یک بار اجرا شود. اما نمیتوانم فقط از forkJoin استفاده کنم چون ترتیب نیز باید حفظ شود.

گزینههایی که تاکنون پیدا کردهام عبارتند از:

  1. بازگشت forkJoin(concat(...work)) از نظر فنی کار میکند چون forkJoin منتظر تکمیل یک concat واحد میماند، اما همچنین احساس نادرستی دارد چون من فقط یک observable به forkJoin میدهم فقط برای این که منتظر تکمیل آن باشد، در حالیکه forkJoin به طور خاص برای مدیریت چندین observable ساخته شده است.
  2. بازگرداندن concat(...work).pipe(toArray()) شاید بهتر از forkJoin باشد اما هنوز احساس میکنم که یک اپراتور بهتر را از دست دادهام. همچنین takeLast() وجود دارد که تقریباً به همان شکل عمل میکند اما هنوز اشتباه به نظر میرسد چون به نظر میرسد اهمیت آخرین مقدار برایم مهم است در حالی که فقط میخواهم پایان را داشته باشم. چیزی شبیه finalize() اما یک مورد که مقدار منتشر کند تا بتوان از آن برای مسدود کردن جریان استفاده کرد.

(نمونههای Stackblitz اینجا)

آیا اپراتور بهتری برای انتظار تا تکمیل concat وجود دارد، یا صرفاً جایگزین بهتری برای concat که به طور کلی observables را به ترتیب اجرا کند و اجازه دهد نتیجه مانند forkJoin زنجیرهای شود، وجود دارد؟ من فقط این احساس را دارم که با forkJoin، آنها اپراتورهایی برای انتظار برای تکمیل چندین observable و اپراتورهایی برای حفظ ترتیب دارند، حتماً یک اپراتور اساسی وجود دارد که من نادیده گرفتهام و فقط منتظر میماند تا یک observable منبع کامل شود و سپس منتشر میکند.

پاسخ شماره ۱

من فکر نمیکنم چیزی در راهحلهایی که تا کنون ارائه کردهاید اشتباه باشد، اما شاید راهحل زیر که از concat و reduce استفاده میکند، نیت شما را بهتر منتقل کند:

concat(...work).pipe(
    reduce(() => undefined)
);
  • concat می گوید که مشاهده پذیرها به ترتیب اجرا می شوند.
  • reduce زمانی که منبع آن منتشر میکند، یک بار منتشر میکند

    • کد () => undefined نشان میدهد که شما واقعاً به مقدار اهمیت نمیدهید

دموی استکبلیتز.