콜백이 없을 때`await promisify (setTimeout) (ms)`는 어떻게 작동합니까?

Aug 19 2020

JavaScript의 간단한 비동기 절전 기능의 경우 await promisify(setTimeout)(ms)작동합니다!

하지만 어떻게? 주장이 틀린 것 같습니다.

  • promisify 는 오류 콜백을 전달하므로
  • setTimeout 호출은setTimeout(ms, errorCallback)

작동하지 않아야하지만 작동합니다. 어떻게?


import { promisify } from 'util'
(async () => {
  // const start = Date.now()
  await promisify(setTimeout)(1000)
  // console.log(Date.now() - start)
})()
node <<HEREDOC
  (async () => {
    // const start = Date.now();
    await require('util').promisify(setTimeout)(1000);
    // console.log(Date.now() - start);
  })()
HEREDOC

배경 : await setTimeout(() => {}, 1000) 작동하지 않습니다 . 이 한 줄짜리 : await new Promise(resolve => setTimeout(resolve, 1000))나를 위해 작동하지 않았습니다 (왜?). 우리는 그것을 수동으로 약속 할 수 있습니다 . const sleep = ms => new Promise(resolve => setTimeout(resolve, ms)); await sleep(1000)그러나 그것은 추가 기능 입니다. 우리는 더 잘할 수 있습니다.

답변

1 snak Aug 20 2020 at 00:31

때문이다 setTimeout가 사용자 정의 promisified 기능을 지금. 인쇄 할 때 찾을 수 있습니다 setTimeout.

> console.log(setTimeout)
{ [Function: setTimeout] [Symbol(util.promisify.custom)]: [Function] }
undefined

표준 방식이 아닌 콜백을받는 일반적인 함수에는 사용자 지정 약속 util.promisify된 함수가있을 수 있으며 함수에 사용자 지정 약속 된 함수가있을 때 반환합니다.

PatrickFisher Aug 20 2020 at 00:39

setTimeout특별한 경우 입니다 promisify.

당 Node.js를 사양 :

참고 :이 메서드에는 util.promisify ()를 사용하여 사용할 수있는 promise에 대한 사용자 지정 변형이 있습니다.

const util = require('util');
const setTimeoutPromise = util.promisify(setTimeout);

setTimeoutPromise(40, 'foobar').then((value) => {
 // value === 'foobar' (passing values is optional)
 // This is executed after about 40 milliseconds.
});

async / await를 사용하면 다음과 같이됩니다.

await promisify(setTimeout)(1000)