我有一个异步功能。我想创建一个对象,对象中属性的值是异步函数的返回。但是现在该属性的值是一个对象承诺
我的代码是这样的:
const promise1 = new Promise(function(resolve, reject) {
resolve('myvalue');
});
const a = async () => {
var b = await promise1
return b;
}
const newobj = {'a': a()};
console.log(newobj)
// the result is : {a: Promise {<resolved>: "myvalue"}} but i want {a: "myvalue"}
答案 0 :(得分:1)
您的代码存在问题是您将return of a
(这是一个异步函数,因此它将返回Promise
)分配给newObj.a
异步函数可以包含await表达式,该表达式暂停异步函数的执行并等待传递的Promise的分辨率,然后恢复异步函数的执行并返回解析的值。您可以详细了解here
请记住,await关键字仅在异步函数内有效。如果在异步函数的主体外部使用它,则会出现SyntaxError。
方法1
const promise1 = new Promise(function(resolve, reject) {
resolve('myvalue');
});
const a = async() => {
var b = await promise1
return b;
}
const printData = async() => {
const newobj = {
'a': await a()
};
console.log(newobj)
}
printData()
编辑:根据johnson andriatiana的要求,我已将代码包装在异步IIFE函数中。
方法2:
(async() => {
const promise1 = new Promise(function(resolve, reject) {
resolve('myvalue');
});
const a = async() => {
var b = await promise1
return b;
}
const newobj = {
'a': await a()
};
console.log(newobj)
})();
答案 1 :(得分:1)
这里的问题是,运行 a()将返回承诺,因此,为了分配承诺的结果,您应该等待它首先完成。
这是一种可能的方法:
const promise1 = new Promise(function(resolve, reject) {
resolve('myvalue');
});
const a = async () => {
var b = await promise1
return b;
}
const run = async () => {
const newobj = {'a': await a()};
console.log(newobj);
}
run()
答案 2 :(得分:0)
您需要await
异步功能。因此,
const newobj = {'a': a()};
做
const newobj = {'a': await a()};
a()
返回一个承诺,await a()
是(将是)该承诺返回的值。