मेरे पास एक ऐसी सेवा है जो सभी एसिंक डेटा को संभालती है, फिर निर्भरता इंजेक्शन के माध्यम से, मैं इसे घटक में पास कर रहा हूं। मैं संकल्प का उपयोग करने के लिए अपने एसिंक कोड को दोबारा प्रतिक्रिया देना चाहता हूं क्योंकि घटक लोड होने से पहले मैं डेटा की प्रतीक्षा करना चाहता हूं।

मेरी सेवाएं:

#1 httpसेवा

getCategories(): Observable<CategoryModel[]> {
    return this.httpClient.get<ApiResponse<CategoryModel[]>>(`api/public/categories`,).pipe(
        map((response) => response.data),
        tap((categories) => categories),
    );
}

#2 श्रेणियांसेवा

categories$: BehaviorSubject<CategoryModel[] | false> = new BehaviorSubject(false);

dispatch(): void {
    this.subscriptions$.add(
        this.httpService
            .getCategories()
            .pipe(
                tap((categories) => {
                    return this.categories$.next(categories);
                }),
            )
            .subscribe(),
    );
}

श्रेणियां.घटक.ts

export class ProductsCategoriesComponent implements OnInit {
    categories$ = this.categoriesService.categories$;

    constructor(private categoriesService: CategoriesService) {}

    ngOnInit(): void {
        this.categoriesService.dispatch();
    }
}

और मैंने जो रिज़ॉल्वर बनाया है वह मुझे निम्न त्रुटि देता है:

Type 'BehaviorSubject<false | CategoryModel[]>' is not assignable to type 'Observable<CategoryModel[]>'.
  Types of property 'subscribe' are incompatible.

उत्पादश्रेणियाँ समाधानकर्ता:

@Injectable({ providedIn: 'root' })
export class ProductsCategoriesResolver implements Resolve<CategoryModel[]> {
  constructor(private categoriesService: CategoriesService) {}

  resolve(
    route: ActivatedRouteSnapshot,
    state: RouterStateSnapshot
  ): Observable<CategoryModel[]> {
        return this.categoriesService.categories$;
  }
}
1
I3artosh 1 सितंबर 2021, 20:23

3 जवाब

सबसे बढ़िया उत्तर

मुझे अपना रिज़ॉल्वर लॉजिक उसी में बदलना पड़ा:

@Injectable({ providedIn: 'root' })
export class ProductsCategoriesResolver implements Resolve<CategoryModel[]> {
  constructor(private categoriesService: CategoriesService) {}

  resolve(
    route: ActivatedRouteSnapshot,
    state: RouterStateSnapshot
  ): Observable<CategoryModel[]> {
        return this.httpService
                .getCategories()
                .pipe(
                    tap((categories: CategoryModel[]) => categories)) 
  }
}
1
I3artosh 1 सितंबर 2021, 18:25

बस हमें .asObservable() BehaviorSubject पर इसे Observable में "कन्वर्ट" करने के लिए।

 resolve(
    route: ActivatedRouteSnapshot,
    state: RouterStateSnapshot
  ): Observable<CategoryModel[]> {
        return this.categoriesService.categories$.asObservable();
  }
0
Gaël J 1 सितंबर 2021, 17:26

आप प्रेषण समारोह को बदल सकते हैं

dispatch(): Promise<any> {
  return new Promise((resolve, reject)=>{
     this.subscriptions$.add(
      this.httpService
        .getCategories()
        .pipe(
            tap((categories) => {
                return this.categories$.next(categories);
            }),
        )
        .subscribe(
           data => {
               resolve(data);
           },
           error => {
               reject(error);
           }
        ),
     );
    }
  })
  

और फिर getCategories कॉल को बदल दें

this.categoriesService.dispatch().then(data=>{
    // handle response data here
})
.catch(() => {
    // handle error  
});
0
Vijay Kumawat 3 सितंबर 2021, 06:20