【问题标题】:How to save results of a promise to a variable? [duplicate]如何将承诺的结果保存到变量中? [复制]
【发布时间】:2019-08-30 22:13:48
【问题描述】:

我需要从 API 获取一些 JSON 数据并将结果分配给一个变量。我可以在控制台中看到数据数组,但 [abc] 始终设置为待处理的承诺。

我尝试分配 [abc] 而不是记录 [data] 或简单地返回 [data] 但它不起作用。 理想情况下,我还想停止执行以下代码,直到获得所需的数据,但使用我拥有的代码,文本会在数据之前记录

async function fetchData() 
{
  let response = await fetch('API');
  let data = await response.json();
  data = JSON.stringify(data);
  data = JSON.parse(data);
  return data;
}

let abc = await fetchData()
  .then(data => console.log(data)); 

console.log('This should not be logged if 'abc' does not have the data i need')

(data => console.log(data)) ..>> 这里的数据是我需要的数组,但我不知道如何分配变量。

我在互联网上寻找了许多解决方案,但找不到任何有用的方法。

编辑1:

如果我分配: 让 abc = 等待 fetchData() 如果没有 then 语句,它会给我这个错误: 未捕获的 SyntaxError:await 仅在异步函数中有效

如果我随后删除 await 关键字,它会返回 Promise 而不会解决它。

【问题讨论】:

    标签: javascript async-await es6-promise


    【解决方案1】:

    为了使await 关键字起作用,它必须位于async 函数中。所以你需要首先将你的代码包装在一个异步函数中,比如说一个主函数,然后调用它。示例:

    async function fetchData() {...}
    
    async function main() {
      let abc = await fetchData();
      console.log(abc);
    }
    
    main();
    

    【讨论】:

    • 感谢您的澄清,我最终得到了那个解决方案,我可以看到 IIFE 的许多用途。然而,我仍然对如何在外部引用该值(abc)以让我的应用程序工作感到困惑。我的意思是,即使在 main() 解决后,我也可以在函数内部访问 [abc] 而不能在外部访问,并且它不允许我为其分配外部变量
    • 不,没有明显的解决方案。除非您还将该“外部”代码移动到该主要功能中。您不能免费从外部传递该变量。
    • @Peter 您需要了解同步/异步代码的根本区别。 async/await 只是语法糖,它不会神奇地将根本不可能的事情变成可能。
    • 这实际上就是我想要做的。我需要获取一些数据并在整个应用程序中使用它们,而不仅仅是在单独的函数中。我一开始是用纯 JS 编写应用程序,但我一直坚持这样做。我知道在 React 中我可以将数据保存在 store 中,这样会更容易。
    • @Peter 您是否不小心对另一个答案投了反对票?如果我误会了,我会道歉,但如果是你,那就不好了。
    【解决方案2】:

    应该是这样的

    async function fetchData(){
     let response = await fetch('API');
     let data = await response.json();
     data = JSON.stringify(data);
     data = JSON.parse(data);
     return data;
    }
    
    let abc = await fetchData(); // here the data will be return.
    console.log(abc); // you are using async await then no need of .then().
    

    【讨论】:

    • 哦,是的,我忘了描述这个场景。这是我的第一次尝试,它实际上向我抛出了这个错误:' Uncaught SyntaxError: await is only valid in async function'
    • 是的,我们在解析时使用 .then()。
    • if (answer == "worked_for_you") { vote(answer) } else {devote();}
    猜你喜欢
    • 2021-08-22
    • 1970-01-01
    • 1970-01-01
    • 2021-10-15
    • 2017-11-29
    • 2020-05-10
    • 1970-01-01
    • 2013-12-08
    • 2018-08-10
    相关资源
    最近更新 更多