我想在对象中返回异步函数的值

时间:2019-04-09 12:47:26

标签: javascript promise async-await

我有一个异步功能。我想创建一个对象,对象中属性的值是异步函数的返回。但是现在该属性的值是一个对象承诺

我的代码是这样的:

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"}

3 个答案:

答案 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()是(将是)该承诺返回的值。