import {
  // catchError,
  defer,
  lastValueFrom,
  Observable,
  // retry,
  // throwError,
  timer,
} from 'rxjs';

// timer 延迟执行
const exampleTimer = timer(2000);

exampleTimer.subscribe({
  next: (value) => console.log('titmer emiited:', value),
  complete: () => console.log('timer completed'),
});

// 示例二：介绍retry、catchError 重试及错误处理逻辑
let count = 0;
const errorProneObservable = new Observable((subscriber) => {
  console.log('retry:', count++);
  subscriber.error(new Error('this is an error'));
});

const handledObservable = errorProneObservable.pipe(
  retry(3),
  catchError((err) => {
    console.log('catch error', err);
    return throwError(() => new Error('Error after retries'));
  }),
);

handledObservable.subscribe({
  error: (err) => {
    console.log(
      'subscribe error Final Error:',
      err && err.message ? err.message : err,
    );
  },
});

// 示例三：
// 延迟创建Observable，需要被订阅的时候，才会创建
const deferObservalbe = defer(() => {
  console.log('Observable created');
  return new Observable((subscriber) => {
    subscriber.next('Hello');
    subscriber.next('Hello1');
    subscriber.next('Hello2');
    timer(2000).subscribe(() => {
      subscriber.next('Hello3');
      subscriber.complete();
    });
  });
});

async function getDeferedValue() {
  const result = await lastValueFrom(deferObservalbe);
  console.log('Defered Value:', result);
}

getDeferedValue();
