Доступ к экземпляру обещания, который возвращается из асинхронной функции - PullRequest
0 голосов
/ 14 октября 2018

Асинхронная функция автоматически возвращает обещание. Интересно, есть ли способ как-то получить этот экземпляр этого обещания внутри функции? Например, если я возвращаю фактическое обещание, подобное этому:

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

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

const promise = getSomePromise();
console.log(promise.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 'sucess';
}
const promise = getSomePromise();
console.log(promise.someProp);

Можно ли это сделать?

Спасибо

1 Ответ

0 голосов
/ 14 октября 2018

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

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

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

Если вы хотите добавить свойствочтобы вернуть обещание, вам придется использовать не async функцию.Вы можете сделать весь код функции не-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);
    });
...