Доступ к экземпляру обещания, который возвращается из асинхронной функции

1

Функция Async автоматически возвращает обещание - интересно, есть ли способ каким-то образом получить этот экземпляр этого обещания внутри функции. Например, если я верну свое настоящее обещание так:

const getSomePromise = () => {
    const promise = new Promise((resolve, reject) => {
      setTimeout(() => {
        resolve('success');
       }, 1000);
    })

    promise.someProp = 'myProp';
    return promise;
}

const promise = getSomePromise();
console.log(promise.someProp);

Я хочу добиться того же самого результата с чистой функцией async:

const sleep = ts => new Promise(resolve => setTimeout(resolve, ts));

const getSomePromise =  async () => {
     const p = await sleep(1000);
     // some how access the instance of the promise from within the async function 
     // for example this['someProp'] = 'myProp';
     // and return the all promise with this prop
     return 'sucess';
}
const promise = getSomePromise();
console.log(promise.someProp);

Могу ли я сделать это?

Спасибо

  • 0
    Нет, это невозможно. Что вы пытаетесь сделать, для чего вы хотите использовать .prop ?
  • 0
    добавить некоторый флаг в мой объект обещания - скажем, отменяемый, как описано здесь: github.com/fangj/make-cancelable/blob/master/index.js - я хочу сделать то же самое только с чистой асинхронной функцией - не использовать new Promise
Показать ещё 2 комментария
Теги:
async-await
promise

1 ответ

1
Лучший ответ

Добавление свойства к обещанию - почти наверняка плохая идея (подробнее об этом позже, в разделе " Однако"), но просто поговорим о том, как вы продолжаете это делать:

Интересно, есть ли способ каким-то образом получить этот экземпляр этого обещания внутри функции

Нет, нет. Вы могли бы создать обещание внутри функции и вернуть его, но это не было бы обещанием, которое функция возвращает (это просто повлияет на то, как обетование возвращается функцией).

Если вы хотите добавить свойство в возвращаемое обещание, вам придется использовать функцию async non-. Вы можете сделать функцию целым кодом non- async:

const sleep = ts => new Promise(resolve => setTimeout(resolve, ts));

const getSomePromise = () => {
    const p = sleep(1000).then(() => 'success');
    p.someProp = 'myProp';
    return p;
}
const promise = getSomePromise();
console.log(promise.someProp);

... или вы можете использовать внутреннюю функцию async чтобы вы могли использовать семантику await и так:

const sleep = ts => new Promise(resolve => setTimeout(resolve, ts));

const getSomePromise = () => {
    const p = (async () => {
        await sleep(1000);
        return 'success';
    })();
    p.someProp = 'myProp';
    return p;
}
const promise = getSomePromise();
console.log(promise.someProp);

Однако: добавление свойства к обещанию - почти наверняка плохая идея. Вместо этого, обещают решение для объекта со свойствами как для разрешения, так и для дополнительного someProp:

const sleep = ts => new Promise(resolve => setTimeout(resolve, ts));

const getSomePromise = async () => {
    const p = await sleep(1000);
    // some how access the instance of the promise from within the async function 
    // for example this['someProp'] = 'myProp';
    // and return the all promise with this prop
    return {
        result: 'success',
        someProp: 'myProp'
    };
}
getSomePromise()
    .then(resolution => {
        console.log(resolution.someProp);
    });
  • 0
    Можете ли вы объяснить, почему это almost certainly a bad idea ? Если я хочу добавить возможность к экземпляру обещания, например отмены: github.com/fangj/make-cancelable/blob/master/index.js - почему это плохая идея? мне кажется, что это очень элегантно, но теперь возвращаю сложный объект с ключами, которые мне нужно запомнить
  • 0
    @Adidi - потому что он не выдерживает стандартных операций обещания (как then ). Если вы действительно хотите нести информацию о самом обещании, а не о его значении разрешения, лучшим вариантом будет подкласс Promise (что означает, что вы не можете использовать async функцию).
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню