setTimeout () и clearTimeout () с Promise в TypeScript (строгий режим + все аннотации) - PullRequest
0 голосов
/ 04 апреля 2019

Я видел много примеров таймера с Promise для JavaScript. Большинство из них слишком сложны, но, полагаю, это можно было бы реализовать проще. Однако мне нужно решение для TypeScript в режиме "strict": true со всеми аннотациями.

Я пытался сделать это, пока код ниже:

import Timeout = NodeJS.Timeout;

let testTimeout : Timeout;
const DELAY: number = 3000;

testTimeout = (): Promise<void> => (
  new Promise<void>( (resolve): void => {
    setTimeout(resolve, DELAY);
  })
);

testTimeout = testTimeout().then( () => {
  console.log('done');
});
clearTimeout(testTimeout);

Имеются ошибки:

TS2739: Type '() => Promise<void>' is missing the following properties from type 'Timeout': ref, refresh, unref

TS2349: Cannot invoke an expression whose type lacks a call signature. Type 'Timeout' has no compatible call signatures.

Полагаю, я что-то не так делаю.

1 Ответ

1 голос
/ 04 апреля 2019

Попробуйте это:

function setTimeoutPromise(fn: () => number, delay: number): Promise<number> {
    return new Promise( (resolve, reject) => {
        setTimeout(() => {
            resolve(fn())
        }, delay)
    })
}

setTimeoutPromise(() => {
    console.log('resolving...');
    return 10;
}, 5000).then((res) => console.log('should print 10 after 5 secs', res));

это прекрасно компилируется с tsc --strict true. Я не уверен, если это то, что вы ищете, хотя. Дайте мне знать!

Есть еще один способ достижения этого, о котором я только что подумал:

import * as util from 'util';

const setTimeoutPromise = util.promisify((delay, fn) => setTimeout(fn, delay));
setTimeoutPromise(5000).then(() => console.log('hey you!'));

Это может выглядеть немного странно, но это работает. В основном .promisify ожидает, что стандартная функция callback-last будет передана ему в качестве аргумента, тогда как setTimeout имеет противоположную сигнатуру. Поэтому мы обращаем их вспять:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...