Логотип YeaHub

Обёртка callback-функции в Promise (Promisify Callback Function)

3

JavaScript

Асинхронность

Taza Digital Technologies

Дана функция asyncFn, принимающая единственный аргумент — callback. Сама asyncFn вызывает этот callback асинхронно (через микротаск, без реального ожидания по времени) с двумя аргументами: err и data. Если при выполнении произошла ошибка, err содержит её значение, а dataundefined. Если ошибки нет, err равен null, а data содержит результат.

Нужно реализовать функцию promisify(asyncFn), которая возвращает новую функцию. При вызове эта новая функция должна вызвать asyncFn, передать ей колбэк, и вернуть Promise, который:

  • резолвится значением data, если ошибки не было;

  • реджектится значением err, если ошибка произошла.

Входные данные: asyncFn — функция вида (callback) => void, где callback(err, data) вызывается ровно один раз.

Выходные данные: функция, при вызове возвращающая Promise, который резолвится или реджектится в зависимости от поведения asyncFn.

Ограничения:

  • asyncFn вызывает callback ровно один раз (либо с ошибкой, либо с данными)

  • Реальные задержки (setTimeout с ожиданием) не используются — только микротаски, чтобы результат был детерминирован

Пример:

Вход: asyncFn = (cb) => Promise.resolve().then(() => cb(null, 42))
Выход: promisify(asyncFn)() → resolve(42)

Вход: asyncFn = (cb) => Promise.resolve().then(() => cb("Ошибка сети"))
Выход: promisify(asyncFn)() → reject("Ошибка сети")
Loading...