雑多なブログ

音楽や語学、プログラム関連の話題について書いています

Promise.all()

Promiseを使って非同期処理を行う場合、

Promise.all()を使うと並列で処理を実行できるようなので、活用してみたいと思う。

サンプルコード

promise.js

const loadImage = (url, elem) => {
    return new Promise((resolve, reject) => {
        const request = new XMLHttpRequest()
        
        request.open('GET', url)
        request.responseType = 'blob'

        request.addEventListener('load', () => {
            if (request.status == 200) {
                const blob = new Blob([request.response], { type: 'image/png' })
                const img = document.createElement('img')
                img.src = URL.createObjectURL(blob)
                elem.appendChild(img)
                resolve(true)
            } else {
                console.log(`${request.status}: ${request.statusText}`)
                reject(false)
            }
        })
        request.addEventListener('error', event => console.log('Error'))
        request.send()
    })
}

window.addEventListener('DOMContentLoaded', (event) => {
    const img_div = document.getElementById('images')

    Promise.all([
        loadImage('./img/sample1.png', img_div),
        loadImage('./img/sample2.png', img_div),
        loadImage('./img/sample3.png', img_div),
    ])        

index.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>promise test</title>
<script src="./promise.js" type="module"></script>
</head>
<body>
    <div id="images"></div>    
</body>
</html>