Функция 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);
Могу ли я сделать это?
Спасибо
Добавление свойства к обещанию - почти наверняка плохая идея (подробнее об этом позже, в разделе " Однако"), но просто поговорим о том, как вы продолжаете это делать:
Интересно, есть ли способ каким-то образом получить этот экземпляр этого обещания внутри функции
Нет, нет. Вы могли бы создать обещание внутри функции и вернуть его, но это не было бы обещанием, которое функция возвращает (это просто повлияет на то, как обетование возвращается функцией).
Если вы хотите добавить свойство в возвращаемое обещание, вам придется использовать функцию 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);
});
almost certainly a bad idea
? Если я хочу добавить возможность к экземпляру обещания, например отмены: github.com/fangj/make-cancelable/blob/master/index.js - почему это плохая идея? мне кажется, что это очень элегантно, но теперь возвращаю сложный объект с ключами, которые мне нужно запомнить
then
). Если вы действительно хотите нести информацию о самом обещании, а не о его значении разрешения, лучшим вариантом будет подкласс Promise (что означает, что вы не можете использовать async
функцию).
.prop
?new Promise