首页 > 解决方案 > 如何使用 promise map 实现嵌套循环

问题描述

我有这样的代码:

Promise.all(venue.map(venue => {
    return Promise.all(concat_all.map(tgl => {
        pool.query("INSERT INTO peminjaman_venue VALUES (?,?,?,?,?,?,?,?,?,?,?)",
            [id_event, venue, nama_lengkap_peminjam, jabatan_nim_peminjam, jumlah_personel,
                id_google_calendar, waktu_mulai_rutin, waktu_selesai_rutin, tgl,
                tgl, fasilitas_lain],
            function (err, rows, fields) {
                if (err) throw err;
            })
    }))
}).then(
    req.flash('message_success', 'Berhasil mengajukan event'),
    res.redirect('/pengajuan_event'))
    .catch(
    req.flash('message_err', 'Gagal mengajukan event'),
    res.redirect('/pengajuan_event')
    ))

发送后代码返回错误 Can't set header,表示 res.redirect() 被多次调用。但代码有效。数据成功插入数据库。我更改了下面的代码,但代码根本不起作用。

Promise.all(venue.map(venue => {
    return Promise.all(concat_all.map(tgl => {
        pool.query("INSERT INTO peminjaman_venue VALUES (?,?,?,?,?,?,?,?,?,?,?)",
            [id_event, venue, nama_lengkap_peminjam, jabatan_nim_peminjam, jumlah_personel,
                id_google_calendar, waktu_mulai_rutin, waktu_selesai_rutin, tgl,
                tgl, fasilitas_lain],
            function (err, rows, fields) {
                if (err) throw err;
            })
    }))
}).then(() = >{
    req.flash('message_success', 'Berhasil mengajukan event')
    res.redirect('/pengajuan_event'))
    }

    .catch((err) => {
    req.flash('message_err', 'Gagal mengajukan event')
    res.redirect('/pengajuan_event')
    }
    )
)

标签: javascriptnode.jsexpresspromise

解决方案


我会创建一个数组来保存你所有的异步请求。所以

const promises = [];
promises.push(async request 1);
promises.push(async request 2);
...

Promise.all(promises).then(result => {
 // do something ...
})

我还会稍微重构代码以使用 async/await 删除其中一些括号。所有这些嵌套的 Promise 很难阅读。


推荐阅读