पिछले एक को सफलतापूर्वक समाप्त करने पर मैं एक एपीआई को एक नया कॉल कैसे कर सकता हूं?
मैं कोणीय और rxjs के लिए नया हूं, और मेरे पास निम्न परिदृश्य है, जिसमें मुझे आवश्यकता है कि एपी को कॉल करने के बाद एक नया कॉल करने के लिए सफलतापूर्वक हल किया गया है, कोणीय / rxjs के संदर्भ में मैं नहीं जानता कि कैसे करना है यह
handler(): void {
this.serviceNAme
.createDirectory(this.path)
.pipe(
finalize(() => {
this.someProperty = false;
})
)
.subscribe(
(data) => console.log(data),
(error) => console.error(error.message)
);
}
पिछले एक सफल होने पर एपी को एक नया कॉल करने का सही तरीका क्या है?
जवाब
मैं समझता हूं कि आपके पास एक 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 => {},
});
}
का उपयोग करना 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
आपकी दो सेवा एपीआई कॉल स्वतंत्र हैं, आप बस एक जाना चाहते हैं और फिर अगला
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
, और दूसरा कॉल कभी नहीं किया जाता है।