Тайм-аут после n-секунд, если определенное значение не выдается - PullRequest
0 голосов
/ 03 апреля 2019

Я использую angularfire2, чтобы выдвинуть Firebase на объект со статусом NEW.Мой бэкэнд прослушивает записи в этом списке и будет выполнять действия для каждого нового запроса со статусом NEW.Я хочу обработать 3 возможных результата: УСПЕХ, ОШИБКА и время ожидания.

add(book: Book) {
        return this.authentication.user.pipe(
            take(1),
            switchMap(user => {
                // Set owner for the backend to handle correctly
                book.setOwner(user.uid);

                // Add book request
                const queueRef = this._afqueue.list(this.ADD_BOOK_QUEUE_PATH);
                const pushPromise = queueRef.push({ status: { code: 'NEW' }, ...book })
                    .then(ref => {
                        console.log('Request to add a new book added to queue.');
                        return ref;
                    }) as Promise<any>;
                return from(pushPromise);
            }),
            switchMap(ref => {
                return this._afqueue.object(this.ADD_BOOK_QUEUE_PATH + '/' + ref.key)
                    .valueChanges();
            }),
            map(snap => snap['status']),
            filter(status => status['code'] === 'SUCCESS' || status['code'] === 'ERROR'),
            switchMap(status => {
                if (status['code'] === 'SUCCESS') {
                    return Observable.create(function(observer) {
                        observer.complete(status['book_id']);
                      });
                    //return status['book_id'];
                }
                else if (status['code'] === 'ERROR') {
                    throw(status['error']);
                }
            }),
            timeout(60000), // timeout after 60 secondes
        );
    }

Время ожидания происходит независимо от того, получаю ли я ОШИБКУ или УСПЕХ.Как я могу тайм-аут, только если я не получаю ни одного после 60 секунд?

1 Ответ

0 голосов
/ 03 апреля 2019

Я переписал это так, который работает:

add(book: Book) {
        return this.authentication.user.pipe(
            take(1),
            mergeMap(user => {
                // Set owner for the backend to handle correctly
                book.setOwner(user.uid);

                // Add book request
                const queueRef = this._afqueue.list(this.ADD_BOOK_QUEUE_PATH);
                const pushPromise = queueRef.push({ status: { code: 'NEW' }, ...book })
                    .then(ref => {
                        console.log('Request to add a new book added to queue.');
                        return ref;
                    }) as Promise<any>;
                return from(pushPromise);
            }),
            mergeMap(ref => {
                return this._afqueue.object(this.ADD_BOOK_QUEUE_PATH + '/' + ref.key)
                    .valueChanges();
            }),
            map(snap => snap['status']),
            filter(status => (status['code'] === 'SUCCESS' || status['code'] === 'ERROR')),
            first(),
            timeout(60000), // timeout after 60 secondes
            mergeMap(status => {
                console.log(status);
                console.log(status['code'])
                if (status['code'] === 'SUCCESS') {
                    return of(status['book_id']);
                    //return status['book_id'];
                }
                else if (status['code'] === 'ERROR') {
                    throwError(status['error']);
                }
            })
        );
    }
...