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วิธีคืนค่าที่สังเกตได้ แต่กำลังส่งสัญญาเป็นค่าต่อการสมัครสมาชิก :(