निम्नलिखित मामलों में एक अलग परिणाम क्यों? पहला उदाहरण सही ढंग से काम करता है, तीन तत्वों की एक सरणी देता है ["qwe", "rty", "asd"]। दूसरा उदाहरण केवल अंतिम तत्व ["asd"] लौटाता है। कृपया बताएं कि यह कैसे काम करता है? यह व्यवहार क्यों हो रहा है?

मध्यवर्ती चर awaitResult के माध्यम से काम करने वाले पहले उदाहरण में।

class XXX {
  constructor() {
    this.storage = {1: ['qwe'], 2: ['rty'], 3: ['asd']}
  }

  async getValue(key) {
    return this.storage[key];
  }

  async logValues() {
    let keys = [1, 2, 3]
    let values = []

    // ----- First version -----

    await Promise.all(
      keys.map(
        async key => {
          let awaitResult = await this.getValue(key)
          values = values.concat(awaitResult)
        }
      )
    );

    console.log(values)
  }
}

let xxx = new XXX()
xxx.logValues()

दूसरे उदाहरण में awaitResult के बिना काम करना।

class XXX {
  constructor() {
    this.storage = {1: ['qwe'], 2: ['rty'], 3: ['asd']}
  }

  async getValue(key) {
    return this.storage[key];
  }

  async logValues() {
    let keys = [1, 2, 3]
    let values = []

    // ----- Second version -----
   
    await Promise.all(
      keys.map(
        async key => values = values.concat(await this.getValue(key)),
      )
    );

    console.log(values)
  }
}

let xxx = new XXX()
xxx.logValues()
0
Riwa 29 अक्टूबर 2019, 20:52

1 उत्तर

आप values की गणना के तरीके को बदलना चाहते हैं, क्योंकि आप इसके लिए Promise.all को पूरी तरह से जिम्मेदार बना सकते हैं:

  async logValues() {
    const mapFn = async(key) => this.getValue(key);
    const values = await Promise.all(this.keys.map(mapFn));
    console.log(values)
    return values;
  }

ध्यान दें कि यह काम करता है क्योंकि हम एक-पंक्ति तीर फ़ंक्शन का उपयोग कर रहे हैं: यह स्वचालित रूप से फ़ंक्शन स्टेटमेंट का परिणाम देता है (जो कि नहीं मामला है जब आप अपने एरो फंक्शन बॉडी को कई लाइनों में घुंघराले के साथ विभाजित करते हैं कोष्ठक)।

इसके अलावा, मुझे लगता है कि keys वास्तव में सरणी [1,2,3] नहीं है, क्योंकि यह अजीब होगा, लेकिन अगर आपको संख्याओं के अनुक्रम की आवश्यकता है, और आप नहीं करते हैं उस सरणी को हार्डकोड करना चाहते हैं, new Array(n).fill().map( (_,index) => console.log(index) ) जहां n कुछ संख्या है, चाल चलनी चाहिए।

0
Mike 'Pomax' Kamermans 29 अक्टूबर 2019, 18:13