1 การดำเนินการ / การแปลงโดยตรง
ใช้from
เพื่อแปลงสัญญาที่สร้างขึ้นก่อนหน้านี้โดยตรงเป็นที่สังเกตได้
import { from } from 'rxjs';
// getPromise() will only be called once
const observable$ = from(getPromise());
observable$
จะเป็นสิ่งที่สังเกตได้อย่างร้อนแรงซึ่งจะชดเชยมูลค่าของสัญญาให้กับสมาชิกได้อย่างมีประสิทธิภาพ
ร่างกายของสัญญาถูกดำเนินการหรือได้รับการแก้ไขแล้วเมื่อสร้างสิ่งที่สังเกตได้ หากสัญญาภายในได้รับการแก้ไขผู้สมัครสมาชิกรายใหม่ที่สามารถสังเกตได้จะได้รับมูลค่าทันที
2 การดำเนินการรอการตัดบัญชีในการสมัครสมาชิกทุกครั้ง
ใช้defer
กับฟังก์ชั่นสัญญาโรงงานเป็นอินพุตเพื่อเลื่อนการสร้างและการแปลงสัญญาเป็นแบบสังเกตได้
import { defer } from 'rxjs';
// getPromise() will be called every time someone subscribes to the observable$
const observable$ = defer(() => getPromise());
observable$
จะเป็นที่สังเกตได้เย็น
ข้อแตกต่างfrom
คือdefer
รอสมาชิกและจากนั้นสร้างสัญญาใหม่โดยการเรียกฟังก์ชั่นโรงงานสัญญาที่กำหนด สิ่งนี้มีประโยชน์เมื่อคุณต้องการสร้างสิ่งที่สังเกตได้ แต่ไม่ต้องการให้มีการดำเนินการตามสัญญาภายใน สัญญาภายในจะถูกดำเนินการเมื่อมีคนสมัครรับข้อมูลที่สังเกตได้ ผู้สมัครสมาชิกแต่ละคนจะได้รับการติดตามใหม่ของตัวเอง
3 ผู้ประกอบการจำนวนมากยอมรับคำสัญญาโดยตรง
ส่วนใหญ่ผู้ประกอบ RxJS ที่รวม (เช่นmerge
, concat
, forkJoin
, combineLatest
... ) หรือเปลี่ยน observables (เช่นswitchMap
, mergeMap
, concatMap
, catchError
... ) ยอมรับสัญญาโดยตรง หากคุณใช้หนึ่งในนั้นคุณไม่จำเป็นต้องใช้from
คำสัญญาก่อน (แต่เพื่อสร้างความเย็นที่สังเกตได้คุณยังอาจต้องใช้defer
)
// Execute two promises simultaneously
forkJoin(getPromise(1), getPromise(2)).pipe(
switchMap(([v1, v2]) => v1.getPromise(v2)) // map to nested Promise
)
ตรวจสอบเอกสารหรือการใช้งานเพื่อดูว่าผู้ให้บริการที่คุณใช้ยอมรับObservableInput
หรือSubscribableOrPromise
ไม่
type ObservableInput<T> = SubscribableOrPromise<T> | ArrayLike<T> | Iterable<T>;
// Note the PromiseLike ----------------------------------------------------v
type SubscribableOrPromise<T> = Subscribable<T> | Subscribable<never> | PromiseLike<T> | InteropObservable<T>;
ความแตกต่างระหว่างfrom
และdefer
ในตัวอย่าง: https://stackblitz.com/edit/rxjs-6rb7vf
const getPromise = val => new Promise(resolve => {
console.log('Promise created for', val);
setTimeout(() => resolve(`Promise Resolved: ${val}`), 5000);
});
// the execution of getPromise('FROM') starts here, when you create the promise inside from
const fromPromise$ = from(getPromise('FROM'));
const deferPromise$ = defer(() => getPromise('DEFER'));
fromPromise$.subscribe(console.log);
// the execution of getPromise('DEFER') starts here, when you subscribe to deferPromise$
deferPromise$.subscribe(console.log);
from
วิธีคืนค่าที่สังเกตได้ แต่กำลังส่งสัญญาเป็นค่าต่อการสมัครสมาชิก :(