zkrvndm
@zkrvndm
Архитектор решений

Как получить промисо-завершающий callback от асинхронной функции?

Как находясь внутри асинхронной функции получить колбек для завершения промиса? Промиса, который возвращает асинхронная функция? Без использования return? Мне нужна именно что колбек-функция! Или ссылка на неё.

Можно ли это сделать через прототипы, как-нибудь вот так?
async function test() {
    var rejected = test['__proto__']['че-нибудь1']['че-нибудь2']['колбек'];
    recected(1);
}

Иди вдруг для этого есть какие-то нативные методы? Я не могу знать всего, но допустим завершающий колбек мог бы хранится внутри event / this или еще где-нибудь, я просто не знаю, где именно (просто предположение).
  • Вопрос задан
  • 123 просмотра
Пригласить эксперта
Ответы на вопрос 2
sergiks
@sergiks Куратор тега JavaScript
♬♬
завершающий callback

только в промисах. async/await – сахар (а сахар это вредно, вызывает привыкание) Вот, привыкли, теперь надо «слезать» )

Можно вынести таймаутность в функцию для читабельности:
const waitFor = (ms) => new Promise((resolve) => setTimeout(resolve, ms));

async function test() {
    await waitFor(1000);
    return 1;
}
Ответ написан
bingo347
@bingo347 Куратор тега JavaScript
Crazy on performance...
Если правильно понял замысел, то можно как-то так:
async function test() {
    let savedResolve, sevedReject;
    const promiseForReturn = new Promise((resolve, reject) => {
        // этот колбэк отрабатывает синхронно
        sevedResolve = resolve;
        savedReject = reject;
    });
    // поэтому savedResolve и sevedReject уже доступны здесь
    sevedReject(1);
    return promiseForReturn; // промис возвращаемый test() будет связан с этим и ждать его
}

Но лучше с таким все же быть аккуратным
async function test() {
    let savedResolve, sevedReject;
    const promiseForReturn = new Promise((resolve, reject) => {
        sevedResolve = resolve;
        savedReject = reject;
    });
    // это deadlock
    await promiseForReturn;
    sevedResolve(1);
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы