순식간에 터미널에 진행률 표시줄을 표시하는 모듈을 만들었습니다.

파이썬에는 진행 상황을 쉽게 보여주는 tqdm이라는 유명한 모듈이 있습니다.
node라고 아무래도 사용하기 편리한 것이 없었기 때문에 써 보았습니다.

nqdm - npm


for ~ of構文를 사용할 때 객체를 nqdm()으로 래핑하여 진행률 표시줄을 쉽게 표시할 수 있습니다.

또, 다른 루프에도 대응할 수 있도록 수동으로 진행을 갱신하는 기능도 붙어 있습니다.

개발에 사용한 노드의 버전은 v10.10.0입니다.

사용법



설치



npm install nqdm

사용 예



const nqdm = require('nqdm')

// ラップするだけのパターン
const arr = [...Array(1000)]

for(const v of nqdm(arr)) {
    // ここで何かする
}

// 手動での更新も可能
const bar = nqdm(arr.length)

arr.forEach(v => {
    bar.process()
})




  4.70% [==>                      ] 00:00:04 00:01:37 [19.72 iter/sec]

이런 식으로 진행, 경과 시간, 남은 시간, 초당 처리 수를 자동으로 표시합니다.

옵션



출력처나 콜백 등을 지정할 수 있어 Generator에도 대응하고 있습니다.
자세한 내용은 Github의 리포지토리에 작성했습니다.

Yuhsak/nqdm: Simple progress indicator for node.js

내용의 이야기



ECMAScript 2015에는 iterable(반복 가능) 객체라는 개념이 있습니다.
구체적으로는 편입의 객체라면 String, Array, TypedArray, Map, Set가 해당됩니다만, 어쨌든 말하면 for~of문으로 돌릴 수 있는 객체군요.

iterable인 오브젝트는 스스로 만들 수도 있고, 임의의 오브젝트의 [Symbol.iterator] 프로퍼티에 「next 메소드를 실장한 iterator를 돌려주는 함수」를 실장하면 OK입니다.

반복 처리 프로토콜 | MDN

무슨 말을 하는지 모르겠어! 라는 분은 상기의 해설이 매우 자세하게 써 있어 알기 쉽기 때문에 읽어 보세요.

nqdm은 건네받은 오브젝트로부터 iterator를 취득해 「자신의 반복시에 건네받은 오브젝트를 반복한 값을 돌려준다」 새로운 오브젝트를 생성해 돌려줍니다.

이렇게 생성한 객체를 끼워 랩 하는 것으로 for~of에 의한 반복을 훅해 진척의 갱신을 실시하고 있습니다.

단순화된 코드는 이런 느낌입니다. 대체로 분위기를 잡을까요?

const wrapped = (iterable) => {
    const iterator = entity[Symbol.iterator]()
    let i = 0
    const wrapperIterator = {
        next: () => {
            // ここにイテレーション時にフックしたい処理を書く
            i = i+1
            console.log(`${i} times iterated.`)
            return iterator.next()
        }
    }
    const wrapperIterable = {
        [Symbol.iterator]: () => wrapperIterator
    }
    return wrapperIterable
}

자신의 환경에서는 매우 편리하게 사용할 수 있습니다.

오브젝트를 nqdm()로 랩 하는 방법은 for~in 구문`에는 대응하고 있지 않으므로 주의해 주세요.

for~in을 사용할 때는 반복 가능 프로토콜은 이용되지 않고 객체가 가지는 length 프로퍼티를 참조하고 있는 것 같기 때문에, 이번의 구현에서는 대응하고 있지 않습니다. .process()를 호출하여 수동으로 업데이트해야 합니다.

만약 잘 움직이지 않거나 하면 나에게 가르쳐 주거나 풀릭 날려 주면 기쁩니다.

좋은 웹페이지 즐겨찾기