Вы почти никогда не используете then
в функции async
. Смысл функций async
в том, что вы можете использовать await
вместо этого.В вашем случае вы хотите присвоить результат await getActualId()
для id
:
async function getId(){
let id:number = await getActualId();
return id;
}
(Хотя неясно, почему эта функция должна существовать, это просто оболочка вокруг getActualId
.)
Однако есть проблема с getActualId
, и если мы исправим это, нам не нужна аннотация типа на id
в getId
: getActualId
отсутствует ее аннотация возвращаемого типа, поэтомуон неявно возвращает Promise<any>
.Если он возвращает Promise<number>
, вам нужно сказать, что:
function getActualId(): Promise<number> {
return new Promise(function (resolve) {
chrome.storage.sync.get({
userId: true
}, function (userId) {
resolve(userId.userId);
});
});
}
Пример на игровой площадке :
function getActualId(): Promise<number> {
return new Promise((resolve) => {
setTimeout(() => {
resolve(Math.floor(Math.random() * 100));
}, 100);
});
}
async function getId() {
let id = await getActualId();
return id;
}
Если вы наводите id
в getId
, вы увидите, что TypeScript знает, что это number
благодаря сигнатуре getActualId
, поэтому нам не нужна аннотация типа, поскольку TypeScript может вывести ее.
¹«почти никогда», я имею в виду искренне почти никогда.Единственный пример, который я могу вспомнить, - это если у вас есть несколько операций, выполняемых параллельно (то есть вы используете Promise.all
), и вам нужно выполнить преобразование результата одной из них.Тогда вы могли бы сделать это:
const [first, second, third] = await Promise.all([
firstOp(),
secondOp().then(value => value.toUpperCase()),
thirdOp()
]);
, поскольку использование await
на secondOp
задержит начало thirdOp
(в то время как вышеописанное - нет).