मेरे पास एक व्यक्ति के स्वामित्व वाली सभी पुस्तकों के बारे में जानकारी के साथ एक सरणी भरने के लिए यह कोड है:

async getAllInfo(person_id)
{

    let book_list = await this.getBooks(person_id);

    for(let book in book_list)
    {
        book_list[book]["book_info"] = await this.getBookInfo(book_list[book]["book_id"])
    }

    return book_list;
}

जब मैं गेटबुक चलाता हूं तो मुझे मिलता है:

[
    {
        "name": "BookA",
        "book_id" : "123"
    },
    {
        "Name": "BookB",
        "book_id" : "456"
    }
]

और फिर मैं लूप के लिए पुस्तक के बारे में जानकारी पूरी करता हूं:

[
    {
        "name": "BookA",
        "book_id" : "123",
        "book_info": {
            "author": "authorA",
            "publish_year": 1900
        }
    },
    {
        "name": "BookB",
        "book_id" : "456",
        "book_info": {
            "author": "authorB",
            "publish_year": 1900
        }
    }
]

GetBooks और getBookInfo http कॉल हैं और जब किसी व्यक्ति के पास बहुत सारी किताबें होती हैं तो सभी जानकारी प्राप्त करने में कुछ समय लग सकता है। सरणी में सभी पुस्तकों के लिए इसे एक साथ प्राप्त करना संभव है? मैंने प्रतीक्षा को हटाने और Promise.all() का उपयोग करने का प्रयास किया, लेकिन मुझे हमेशा मिलता है:

[
    {
        "name": "BookA",
        "book_id" : "123",
        "book_info": {
            "domain": {
                "domain": null,
                "_events": {},
                "_eventsCount": 1,
                "members": []
            }
        }
    },
    {
        "name": "BookB",
        "book_id" : "456",
        "book_info": {
            "domain": {
                "domain": null,
                "_events": {},
                "_eventsCount": 1,
                "members": []
            }
        }
    }
]
0
Eve 27 अक्टूबर 2018, 18:59

3 जवाब

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

कोड के इस टुकड़े में आप जो कर रहे हैं उसे अनुकूलित किया जा सकता है:

for(let book in book_list) {
    book_list[book]["book_info"] = await this.getBookInfo(book_list[book]["book_id"])
}

क्योंकि प्रत्येक पुस्तक के लिए आप अनुरोध कर रहे हैं और अगली पुस्तक का विवरण लाने से पहले इस अनुरोध के पूरा होने की प्रतीक्षा कर रहे हैं। यहां बताया गया है कि आप एक साथ सभी अनुरोध कैसे कर सकते हैं और पुस्तकों के सभी विवरण प्राप्त होने की प्रतीक्षा कर सकते हैं:

async getAllInfo(person_id) {

    let book_list = await this.getBooks(person_id);

    // Creating an array of Promises to fetch the details of all the books simultaneously
    const fetchingBooksDetails = book_list.map(book => this.getBookInfo(book.book_id));

    // Wainting for the requests to complete
    const booksDetails = await Promise.all(fetchingBooksDetails);

    // Saving the details of the book in the book_list variable
    booksDetails.forEach((bookDetails, index) => {
      book_list[index].book_info = bookDetails;
    });

    return book_list;
}
0
Baboo_ 27 अक्टूबर 2018, 16:20
function getAllInfo(person_id){
    return getBooks(person_id).then(function(book_list){

        var promiseArray = []
        book_list.forEach(function(book,index){
            promiseArray.push(getBookInfo(book_list[index]["book_id"]))
        })
        return Promise.all(promiseArray).then(function(values){
            book_list.forEach(function(book,index){
                book_list[index]["book_info"] = values[index]
            })
            return book_list
        })

    })

}
function getBooks(person_id){
    return new Promise(function(resolve,reject){
        resolve(
        [
            {
                "name": "BookA",
                "book_id" : "123"
            },
            {
                "Name": "BookB",
                "book_id" : "456"
            }
        ]
        )
    })

}
function getBookInfo(book_id){
    return new Promise(function(resolve,reject){
    if(book_id=="123"){
        resolve({
            "author": "authorA",
            "publish_year": 1900
        })
    }
    else if(book_id=="456"){
            resolve({
            "author": "authorB",
            "publish_year": 1900
        })
    }
    else{
        reject()
    }
})
}
getAllInfo("rap_mosnter").then(function(data){
    console.log(data)
})
0
Lakshaya Sood 27 अक्टूबर 2018, 16:31

कुछ इस तरह का प्रयास करें (परीक्षण नहीं किया गया)

async getAllInfo(person_id)
{

    let book_list = await this.getBooks(person_id);
    for(let book in book_list)
    {
        book_list[book]["book_info"] = this.getBookInfo(book_list[book]["book_id"])
    }

    await Promise
      .all(book_list[book].map(b => b.book_info))
      .then(infos => {
        for (book in infos)
          book_list[book]["book_info"] = infos[book];
        });
    return book_list;
}
0
Tom HANAX 27 अक्टूबर 2018, 16:16