순식간에 터미널에 진행률 표시줄을 표시하는 모듈을 만들었습니다.
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()
를 호출하여 수동으로 업데이트해야 합니다.만약 잘 움직이지 않거나 하면 나에게 가르쳐 주거나 풀릭 날려 주면 기쁩니다.
Reference
이 문제에 관하여(순식간에 터미널에 진행률 표시줄을 표시하는 모듈을 만들었습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/Yuhsak/items/854ee2be88d9d2a205e2텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)