Pertanyaan
Untuk tujuan pengujian, saya membuat Observable
objek yang menggantikan observable yang akan dikembalikan oleh panggilan http yang sebenarnya dengan Http
.
Observable saya dibuat dengan kode berikut:
fakeObservable = Observable.create(obs => {
obs.next([1, 2, 3]);
obs.complete();
});
Masalahnya, yang dapat diamati ini memancarkan dengan segera. Apakah ada cara untuk menambahkan penundaan khusus pada emisinya?
Jalur
Saya mencoba ini:
fakeObservable = Observable.create(obs => {
setTimeout(() => {
obs.next([1, 2, 3]);
obs.complete();
}, 100);
});
Tapi sepertinya tidak berhasil.
angular
typescript
observable
Adrien Brunelat
sumber
sumber
.create(...)
dengan.delay(1000)
tetapi tidak berhasil: Observable_1.Observable.create (...). Delay bukanlah sebuah fungsi.Jawaban:
Menggunakan impor berikut:
import {Observable} from 'rxjs/Observable'; import 'rxjs/add/observable/of'; import 'rxjs/add/operator/delay';
Coba ini:
let fakeResponse = [1,2,3]; let delayedObservable = Observable.of(fakeResponse).delay(5000); delayedObservable.subscribe(data => console.log(data));
PEMBARUAN: RXJS 6
Solusi di atas tidak benar-benar berfungsi lagi di versi RXJS yang lebih baru (dan sudut misalnya).
Jadi skenarionya adalah bahwa saya memiliki serangkaian item untuk diperiksa dengan API. API hanya menerima satu item, dan saya tidak ingin menghentikan API dengan mengirim semua permintaan sekaligus. Jadi saya perlu rilis item yang diatur waktunya di aliran Observable dengan sedikit penundaan di antaranya.
Gunakan impor berikut:
import { from, of } from 'rxjs'; import { delay } from 'rxjs/internal/operators'; import { concatMap } from 'rxjs/internal/operators';
Kemudian gunakan kode berikut:
const myArray = [1,2,3,4]; from(myArray).pipe( concatMap( item => of(item).pipe ( delay( 1000 ) )) ).subscribe ( timedItem => { console.log(timedItem) });
Ini pada dasarnya menciptakan Observable 'tertunda' baru untuk setiap item dalam array Anda. Mungkin ada banyak cara lain untuk melakukannya, tetapi ini berfungsi dengan baik untuk saya, dan sesuai dengan format RXJS 'baru'.
sumber
import {Observable} from 'rxjs/Observable';
?import 'rxjs/add/observable/of';
. Apakah Anda kebetulan melakukan hal yang sama? Ini masih aneh, karena tidak akan dirantai dengan .delay (...) dan itu menunjukkan kesalahan ketika saya mencobarxjs/add/observable/delay
...of(item.pipe ( delay( 1000 ) ))
harusof(item))).pipe(delay(1000)
mencoba untuk pipa array memberi saya kesalahanDi RxJS 5+ Anda dapat melakukannya seperti ini
import { Observable } from "rxjs/Observable"; import { of } from "rxjs/observable/of"; import { delay } from "rxjs/operators"; fakeObservable = of('dummy').pipe(delay(5000));
Di RxJS 6+
import { of } from "rxjs"; import { delay } from "rxjs/operators"; fakeObservable = of('dummy').pipe(delay(5000));
Jika Anda ingin menunda setiap nilai yang dipancarkan coba
from([1, 2, 3]).pipe(concatMap(item => of(item).pipe(delay(1000))));
sumber
Yang Anda inginkan adalah pengatur waktu:
// RxJS v6+ import { timer } from 'rxjs'; //emit [1, 2, 3] after 1 second. const source = timer(1000).map(([1, 2, 3]); //output: [1, 2, 3] const subscribe = source.subscribe(val => console.log(val));
sumber
Agak terlambat untuk menjawab ... tetapi untuk berjaga-jaga mungkin seseorang kembali ke pertanyaan ini mencari jawaban
'delay' adalah properti (fungsi) dari sebuah Observable
fakeObservable = Observable.create(obs => { obs.next([1, 2, 3]); obs.complete(); }).delay(3000);
Ini berhasil untuk saya ...
sumber
import 'rxjs/add/operator/delay'
memberikan kesalahan ini sekarang: Modul tidak ditemukan: Kesalahan: Tidak dapat menyelesaikan 'rxjs / add / operator / delay'import * as Rx from 'rxjs/Rx';
Kita harus menambahkan impor di atas untuk membuat kode pukulan berfungsi
Let obs = Rx.Observable .interval(1000).take(3); obs.subscribe(value => console.log('Subscriber: ' + value));
sumber