我正在尝试从诺言中返回数字:从getActualId
调用函数chrome.local.storage
并返回诺言:
function getActualId(){
return new Promise(function (resolve) {
chrome.storage.sync.get({
userId: true
}, function (userId) {
resolve(userId.userId);
});
});
}
此函数获得正确的值,但是当我从另一个函数调用它时,我不断得到getId
函数返回一个Promise<number>
而不是一个诺言。
async function getId(){
let id:number = 0;
await getActualId().then( function(userid:number){
id = userid;
})
return id
}
如何从id
中获得getId
而不是promise<number>
的真实值?
答案 0 :(得分:3)
您几乎从未在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
的启动(而上面的命令则不会)。