简体   繁体   中英

How can I push data to an array inside a promise then?

I've been trying to figure out. How I can push a result to an array from a promise loop. Can anyone point me in the right location?

const ids = [1, 2, 3]
let results = []

for (let id of ids) {
    getLight(id)
        .then(light => {
            results.push(light)
        })
        .catch(err => {
            console.log(err)
        })
}

Promises are asynchronous, so you can't do that. You can use Promise.all though to compose the promises together and then wait on the result:

const ids = [1, 2, 3]
Promise.all(ids.map(id => getLight(id))).then(results => {
  // do something with results here
})

Breaking this down:

  1. ids.map(id => getLight(id)) converts the ids to an array of unresolved promises.

  2. Promise.all(promises).then(results => { ... }) resolves all the promises and passes the results (in the correct order) to the callback

 const ids = [1, 2, 3] let results = [] Promise.all( ids.map((id) => getLight(id) .then(light => { results.push(light) }) .catch(err => { console.log(err) }) )).then(() => console.log(results)) function getLight(id) { return new Promise((res) => { setTimeout(res, 1000) }).then(() => `light for id: ${id}`) } 

with async/await

 (async() => { const ids = [1, 2, 3] let results = await Promise.all( ids.map((id) => getLight(id)) ) console.log(results); })() function getLight(id) { return new Promise((res) => { setTimeout(res, 1000) }).then(() => `light for id: ${id}`) } 

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM