मेरे पास ऑब्जेक्ट्स/स्ट्रिंग की एक सरणी है।

this.addtenant().subscribe(r => {
    let a = ['plant1', 'plant2'];
    for (let b of a) {
        this.myService.saveAllData(b).subscribe(r => {
            console.log("result" r);
        });
    }
});

और getAllData myservice फ़ाइल में है जो एक अवलोकन योग्य देता है।

    saveAlldata(b) {
     this.http.post(url,b);
    }

समस्या यह है कि जब से मैं सदस्यता का उपयोग कर रहा हूं, कॉल एसिंक्रोनस हो रहा है, मैं इसे कुछ ऐसा करना चाहता हूं: पहले "प्लांट 1" पोस्ट कॉल को समाप्त करना होगा, और फिर प्लांट 2 को बनाना होगा। सरल शब्दों में सिंक्रोनस कॉल।

0
Satya Ram 6 अप्रैल 2020, 10:40
आप जो पूछ रहे हैं वह नहीं, लेकिन यदि आप एक POST अनुरोध कर रहे हैं, तो विधि को GETAllData क्यों कहा जाता है?
 – 
Maria Ines Parnisari
6 अप्रैल 2020, 10:44
क्या आप पहली सेवा कॉल समाप्त होने के बाद दूसरी सेवा कॉल निष्पादित करना चाहते हैं या बस एक के बाद एक कॉल उत्सर्जित करना चाहते हैं?
 – 
programoholic
6 अप्रैल 2020, 13:03
पहली सेवा निष्पादन समाप्त होने के बाद दूसरे को निष्पादित किया जाना चाहिए
 – 
Satya Ram
6 अप्रैल 2020, 13:05
आप पहली सेवा के समाप्त होने की प्रतीक्षा क्यों करना चाहते हैं ? क्या आपको नहीं लगता कि यह प्रदर्शन की समस्या पैदा करेगा?
 – 
programoholic
6 अप्रैल 2020, 13:35
क्योंकि मैं दूसरी सेवा में पहली सेवा से लौटाई गई वस्तु का उपयोग कर रहा हूं, हालांकि मैंने यहां कोड नहीं लिखा है। समस्या दूसरी सेवा के साथ है, यदि आप देखते हैं कि दूसरी सेवा लूप के अंदर है, तो लूप की पहली वस्तु को दूसरी सेवा के साथ निष्पादित किया जाना चाहिए और उसके बाद ही दूसरी वस्तु उसी दूसरी सेवा के साथ निष्पादित की जानी चाहिए।
 – 
Satya Ram
6 अप्रैल 2020, 13:38

2 जवाब

मुझे लगता है कि आपको सिंक्रोनस कॉल के लिए एसिंक/प्रतीक्षा का उपयोग करना चाहिए।

यहाँ ट्यूटोरियल में से एक है: https://www.techiediaries.com/javascript-async-await-tutorial/< /ए>

एक नमूना कोड डेमो कुछ ऐसा होगा:


responseArr: any[] = [];

func1()
  let x = [1,2,3];
  func2(x);
}

async func2(arr) { // make the function async
  for(let i=0; i<arr.length ; i++){
    const response: any = await this.myService(arr[i]); // wait on each service call. This will give synchronous behaviour
    this.handleResponse(response); // handle response in a function if there is common functionality in each response
  }
  reuturn responseArr; // return the final response
}

handleResponse(response) {
  responseArr.push(response);
}
1
AhmerMH 6 अप्रैल 2020, 10:52
मैं किसी भी प्रतिक्रिया को वापस नहीं करना चाहता हूं, कोड क्या होगा, एपीआई कॉल एक के बाद एक समकालिक रूप से होनी चाहिए
 – 
Satya Ram
6 अप्रैल 2020, 11:07
यह ठीक एक उदाहरण है जहां सेवा कॉल समकालिक रूप से हो रही हैं। यदि आप func2(arr) देखते हैं, तो यह वह जगह है जहां वास्तव में प्रतीक्षा के कारण कॉल समकालिक रूप से हो रही हैं। यदि आप कोई प्रतिक्रिया नहीं देना चाहते हैं, तो यह पूरी तरह आप पर निर्भर है, आप इसे अपनी इच्छानुसार उपयोग कर सकते हैं।
 – 
AhmerMH
6 अप्रैल 2020, 14:33

मैंने अपने आप से समाधान ढूंढ लिया है। आप एक लूप के अंदर एक async प्रतीक्षा का उपयोग कर सकते हैं, क्योंकि forEach वादा जागरूक नहीं है और वादा के साथ उपयोग नहीं किया जा सकता है। यहाँ अंतिम कोड है:

this.addtenant().subscribe(async r => {
let a = ['plant1', 'plant2'];
for(let index=0; index=a.length; index++)
    await this.myService.saveAllData(b).toPromise().then(r => {
        console.log("result" r);
    });
}
}
});

जैसा कि प्रॉमिस के साथ प्रतीक्षित काम करता है, इसलिए टूप्रोमिस सब्सक्राइब को बदल देगा ()

0
Satya Ram 6 अप्रैल 2020, 15:23
forkJoin के अंदर समानांतर वेधशाला चलाने के बजाय आप वादों का उपयोग क्यों करेंगे?
 – 
Kurt Hamilton
7 अप्रैल 2020, 10:59