개인의 요구에 맞는 스크립트와 같은 콘솔을 개발 중입니다. 오랜 시간 동안 일시 중지 할 수 있어야하지만 내 연구에서 node.js는 필요에 따라 중지 할 수 없습니다. 일정 기간이 지나면 사용자 정보를 읽기가 어려워지고 있습니다 … 코드가 몇 개 있지만, 내부에 다른 코드가 있어야 다음과 같은 작업을 수행 할 수 있습니다.
setTimeout(function() {
}, 3000);
그러나 일정 기간이 지나면이 코드 줄 뒤의 모든 것이 실행되어야합니다.
예를 들어
//start-of-code
console.log('Welcome to My Console,');
some-wait-code-here-for-ten-seconds..........
console.log('Blah blah blah blah extra-blah');
//endcode.
나는 또한 같은 것들을 보았다
yield sleep(2000);
그러나 node.js는 이것을 인식하지 못합니다.
이 연장 된 일시 정지를 어떻게 달성 할 수 있습니까?
답변
이를 수행하는 가장 좋은 방법은 다음과 같이 코드를 여러 함수로 나누는 것입니다.
function function1() {
// stuff you want to happen right away
console.log('Welcome to My Console,');
}
function function2() {
// all the stuff you want to happen after that pause
console.log('Blah blah blah blah extra-blah');
}
// call the first chunk of code right away
function1();
// call the rest of the code and have it execute after 3 seconds
setTimeout(function2, 3000);
JohnnyHK 의 솔루션 과 비슷 하지만 훨씬 깔끔하고 확장하기 쉽습니다.
답변
오래된 질문에 대한 새로운 답변. 오늘 ( 2017 년 1 월 6 월 2019) 훨씬 쉽습니다. 새로운 async/await
구문을 사용할 수 있습니다 . 예를 들면 다음과 같습니다.
async function init() {
console.log(1);
await sleep(1000);
console.log(2);
}
function sleep(ms) {
return new Promise((resolve) => {
setTimeout(resolve, ms);
});
}
사용하기 위해 async/await
설치 및 플러그인없이 상자 밖으로, 당신은 사용하여 노드-V7 또는 노드-V8을 사용할 필요가 --harmony
플래그를.
2019 년 6 월 업데이트 : 최신 버전의 NodeJS를 사용하면 즉시 사용할 수 있습니다. 명령 줄 인수를 제공 할 필요가 없습니다. 오늘날에도 Chrome에서도 지원합니다.
2020 년 5 월 업데이트 :
곧 await
비동기 함수 외부 에서 구문 을 사용할 수 있습니다. 이 예와 같이 최상위 수준에서
await sleep(1000)
function sleep(ms) {
return new Promise((resolve) => {
setTimeout(resolve, ms);
});
}
제안은 3 단계에 있습니다. webpack 5 (알파)를 사용하여 오늘 사용할 수 있습니다.
더 많은 정보:
- Nodejs의 하모니 플래그 : https://nodejs.org/en/docs/es6/
- 다운로드 할 모든 NodeJS 버전 : https://nodejs.org/en/download/releases/
답변
의존성이없는 가장 짧은 솔루션 :
await new Promise(resolve => setTimeout(resolve, 5000));
답변
setTimeout
콜백 내에 지연 후 실행하려는 코드를 넣으십시오 .
console.log('Welcome to My Console,');
setTimeout(function() {
console.log('Blah blah blah blah extra-blah');
}, 3000);
답변
이것은 간단한 차단 기술입니다.
var waitTill = new Date(new Date().getTime() + seconds * 1000);
while(waitTill > new Date()){}
그건 차단 다른 것도 (콜백 같은) 스크립트에서 일어날 것 인 한. 그러나 이것은 콘솔 스크립트이기 때문에 아마도 필요한 것입니다!
답변
노드 7.6.0 이상에서
노드는 기본적으로 대기를 지원합니다.
const sleep = (waitTimeInMs) => new Promise(resolve => setTimeout(resolve, waitTimeInMs));
그런 다음 비동기 기능을 사용할 수 있다면 :
await sleep(10000); // sleep for 10 seconds
또는:
sleep(10000).then(() => {
// This will execute 10 seconds from now
});
이전 노드 버전 (원래 답변)
CPU가 오래 걸리지 않고 Windows 및 Linux에서 작동하는 비동기 절전 모드가 필요했습니다. 절전 패키지를 시도했지만 Windows 상자에 설치되지 않았습니다. 나는 다음을 사용하여 끝났다.
https://www.npmjs.com/package/system-sleep
설치하려면 다음을 입력하십시오.
npm install system-sleep
귀하의 코드에서
var sleep = require('system-sleep');
sleep(10*1000); // sleep for 10 seconds
매력처럼 작동합니다.
답변
현대적인 자바 스크립트를 사용한 단순하고 우아한 수면 기능
function sleep(millis) {
return new Promise(resolve => setTimeout(resolve, millis));
}
의존성, 콜백 지옥 없음; 그게 다야 🙂
질문에 주어진 예를 고려할 때 두 콘솔 로그 사이에서 잠자기하는 방법입니다.
async function main() {
console.log("Foo");
await sleep(2000);
console.log("Bar");
}
main();
“단점”은 이제 당신의 주요 기능이되어야한다는 async
것입니다. 그러나 현대 Javascript 코드를 이미 작성하고 있다고 생각하면 코드 전체에서 async
/를 사용하고 있거나 적어도 await
문제가되지는 않으므로 실제로는 문제가되지 않습니다. 오늘날 모든 최신 브라우저가 이를 지원 합니다.
팻 화살표 연산자에 sleep
익숙하지 않은 사람들을 위해 함수에 대한 약간의 통찰력을 제공하는 async/await
, 이것은 그것을 작성하는 자세한 방법입니다.
function sleep(millis) {
return new Promise(function (resolve, reject) {
setTimeout(function () { resolve(); }, millis);
});
}
그러나 팻 화살표 연산자를 사용하면 더 작고 우아합니다.