【问题标题】:Return object from async function从异步函数返回对象
【发布时间】:2020-06-28 19:00:38
【问题描述】:

我尝试了几种从异步函数返回对象的方法。我对 JavaScript 很陌生,我不明白为什么这不起作用。

该函数使用 API 返回一些财务数据,然后在获得响应后将返回的 Object 映射到另一个我要返回的对象。

如果我 console.log 对象,一切正常。但是在我的终端中有很多数字并不是我真正希望实现的。

我尝试了以下方法:

let someObject = fetchData(url);
console.log(someObject)

给我“承诺{}”


再试一次:

const returnFetchData = async() => {
    const objectToReturn = await fetchData(url);
    return objectToReturn;
}


console.log(returnFetchData);

给我“[AsyncFunction: returnFetchData]”

这是我的代码:

async function fetchData(urlLink){
const res = await fetch(urlLink);
const out = await res.json();
const timeSeries = out['Time Series (Daily)'];

let returnObject = {
    dates: [],
    adjustedClose: []
}


Object.entries(timeSeries).forEach(
    ([key, value]) => {
    returnObject.dates.push(key)
    returnObject.adjustedClose.push(value['5. adjusted close'])
    }
);


return returnObject;

}

编辑: 我想从 returnObjects.adjustedClose 返回数组。

到目前为止,所有解决方案都返回了一个承诺。 这个数组应该用在另一个函数中,我应该把它映射到那个函数中吗?

【问题讨论】:

  • 异步函数返回承诺。您可以使用承诺的.then 回调,例如promise.then(function(result){...}),或者,如果您在异步函数中,await 承诺,var result = await promise;

标签: javascript asynchronous async-await


【解决方案1】:

在您的代码中

const returnFetchData = async() => {
    const objectToReturn = await fetchData(url);
    return objectToReturn;
}

console.log(returnFetchData); 

换掉console.log(returnFetchData); console.log(await returnFetchData());

你必须await an async function

【讨论】:

  • 返回 [AsyncFunction: returnFetchData]。
  • 你保留括号了吗? await returnFetchData()
  • 我试图等待该功能。但我想返回数组,以便可以在另一个函数中使用数据。所以另一个函数应该创建 const someArrays = await returnFetchData();然后使用 someArrays.dates。也许它应该在主函数中?
  • 你能显示fetchData函数的代码吗?有一个名为 returnFetchData 的函数似乎有点毫无意义,它只调用 fetchData 并且不做任何处理
  • 在我的问题中,代码以“异步函数 fetchData”开头,这是函数。非常感谢任何帮助,在任何地方都找不到答案。
【解决方案2】:

您无法返回数据,因为它没有立即准备好。您要返回的数据取决于一些请求,因此需要一些时间来准备。综上所述,您必须等待该函数 fetchData 来获取和准备数据,然后它将准备好返回您想要的数据。

因此,您可以通过这样的阻塞来达到您想要的数组,returnObject.adjustedClose:

let desiredData = await fetchData(urlLink);
let desiredArray = desiredData.adjustedClose;
console.log(desiredArray);

或像这样的非阻塞:

fetchData(urlLink).then((desiredData) => {
  let desiredArray = desiredData.adjustedClose;
  console.log(desiredArray);
});

请记住,这两者都不会立即记录所需的数据,从 urlLink 获取数据并进行准备需要一些时间。

说明这些代码行的一个选项,等待几秒钟,然后在控制台中查看结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-20
    • 2021-12-03
    • 1970-01-01
    • 2022-01-14
    • 2019-12-19
    • 2020-12-07
    相关资源
    最近更新 更多