Menindaklanjuti nodej menjalankan fungsi async satu demi satu

Saya menemukan bahwa pekerjaan saya yang didefinisikan dalam array semuanya dijalankan sekaligus:

const { promisify } = require('util')
const wait = promisify(setTimeout)

async function longjob(ms) {
  await new Promise(r => setTimeout(r, ms));
}

const longjobs = [ 100, 200, 120 ]

async function myFlow(){
  longjobs.forEach( async (j) => {
    await longjob(j)
    console.log(`done ${j}`)
    await wait(500)
    console.log(`done wait ${j}`)
  })
}
                  
myFlow()
$ node jobs_in_array.js 
done 100
done 120
done 200
done wait 100
done wait 120
done wait 200

Tapi saya ingin menjalankan pekerjaan yang didefinisikan dalam array satu demi satu. Saya pasti melewatkan sesuatu yang sangat sederhana. tolong bantu.

0
xpt 5 Juli 2020, 06:05

1 menjawab

Jawaban Terbaik

Meskipun Anda meneruskan panggilan balik async ke .forEach(), itu tidak menunggu eksekusinya. Jadi Anda akhirnya memanggil 3 fungsi asinkron satu demi satu tetapi tidak ada yang menunjukkan bahwa skrip harus menunggu masing-masing untuk dieksekusi.

Yang dapat Anda lakukan adalah menggunakan loop for ... of:

async function myFlow(){
  for (const j of longjobs) {
    await longjob(j)
    console.log(`done ${j}`)
    await wait(500)
    console.log(`done wait ${j}`)
  }
}
3
shkaper 5 Juli 2020, 03:30