पिछले एक को सफलतापूर्वक समाप्त करने पर मैं एक एपीआई को एक नया कॉल कैसे कर सकता हूं?

Nov 25 2020

मैं कोणीय और rxjs के लिए नया हूं, और मेरे पास निम्न परिदृश्य है, जिसमें मुझे आवश्यकता है कि एपी को कॉल करने के बाद एक नया कॉल करने के लिए सफलतापूर्वक हल किया गया है, कोणीय / rxjs के संदर्भ में मैं नहीं जानता कि कैसे करना है यह

handler(): void {
  this.serviceNAme
    .createDirectory(this.path)
    .pipe(
      finalize(() => {
        this.someProperty = false;
      })
    )
    .subscribe(
      (data) => console.log(data),
      (error) => console.error(error.message)
    );
}

पिछले एक सफल होने पर एपी को एक नया कॉल करने का सही तरीका क्या है?

जवाब

2 adrisons Nov 26 2020 at 15:07

मैं समझता हूं कि आपके पास एक serviceOneऔर एक है serviceTwo। और आप serviceTwoसे प्राप्त डेटा का उपयोग करके कॉल करना चाहते हैं serviceOne

Rxjs स्विचपार्ट का उपयोग करके आप एक अवलोकन को दूसरे में पाइप कर सकते हैं।

    handler(): void {
        this.serviceOne
            .createDirectory(this.path)
            .pipe(
                switchMap(serviceOneResult => {
                    // transform data as you wish
                    return this.serviceTwo.methodCall(serviceOneResult);
                })
            )
            .subscribe({
                next: serviceTwoResult => {
                    // here we have the data returned by serviceTwo
                },
                error: err => {},
            });
    }

यदि आपको डेटा पास करने की आवश्यकता नहीं serviceOneहै, serviceTwoलेकिन आपको दोनों को एक साथ पूरा करने की आवश्यकता है, तो आप rxjs forkJoin का उपयोग कर सकते हैं ।

    handler(): void {
        forkJoin([
            this.serviceOne.createDirectory(this.path), 
            this.serviceTwo.methodCall()
        ])
        .subscribe({
            next: ([serviceOneResult, serviceTwoResult]) => {
                // here we have data returned by both services
            },
            error: err => {},
        });
    }
1 DigitalDrifter Nov 26 2020 at 04:21

का उपयोग करना aysncऔर awaitआप कर सकते हैं:

async handler(): void {
  await this.serviceNAme
    .createDirectory(this.path)
    .pipe(
      finalize(() => {
        this.someProperty = false;
      })
    )
    .subscribe(
      (data) => console.log(data),
      (error) => console.error(error.message)
    );

   // Do second api call
}
1 MrkSef Nov 26 2020 at 05:00

ऐसा करने के लिए कुछ कहते हैं:

दृष्टांत 1

आपकी दो सेवा एपीआई कॉल स्वतंत्र हैं, आप बस एक जाना चाहते हैं और फिर अगला

 const serviceCall1 = this.serviceName.createDirectory(this.path);
 const serviceCall2 = this.serviceName.createDirectory(this.otherPath);

 concat(serviceCall1 , serviceCall2).subscribe({
   next: console.log,
   error: err => console.error(err.message),
   complete: () => console.log("service call 1&2 complete")
 });

परिदृश्य # 2

आपकी दो कॉल एक दूसरे पर निर्भर करती हैं, इसलिए आपको दूसरा शुरू करने से पहले पहले के परिणाम की आवश्यकता होती है

 this.serviceName.getDirectoryRoot().pipe(
   switchMap(root => this.serviceName.createDirectoryInRoot(root, this.path))
 ).subscribe({
   next: console.log,
   error: err => console.error(err.message),
   complete: () => console.log("service call 1 used to create service call 2, which is complete")
 });

आप परिदृश्य # 2 चाहते हैं , क्योंकि इस तरह से, पहली कॉल में एक त्रुटि का मतलब यह होगा कि कोई परिणाम नहीं भेजा जाता है switchMap, और दूसरा कॉल कभी नहीं किया जाता है।