获取JavaScript承诺值[重复]

2023-11-29

我有一个 json 文件,我正在尝试读取其内容以在脚本中使用。我使用以下命令来获取 json:

const json = fetch('Data/my_data.json').then(response => response.json());

当我执行此操作并查看控制台中的 json 对象时,我看到它是一个返回的承诺(已解析状态),其中包含文件中的实际 json 对象。但您无法直接访问 PromiseValue。你必须再次使用 then 语句,所以我使用了这个:

json.then(function(getData){metaData = getData;});

metaData 对象未设置为原始 Promise 的值。直到稍后第二个完成时才会取消设置。尽管在最初返回的承诺中该信息已经可用。

是否可以在没有第二个 then 语句的情况下获得原始的 PromiseValue 或 我是否使用第二个 then 语句错误地访问了承诺?

感谢您的任何见解!


是否可以在没有第二个 then 语句的情况下获得原始的承诺值,或者我是否使用第二个 then 语句错误地访问了承诺。

您必须使用.then() or await获取承诺之外的数据。数据是异步检索的,因此唯一等待将其从承诺中取出的是.then() or await。并且,如果使用await,它必须位于async功能。

虽然承诺和async/await有助于管理异步操作,但它们无法改变数据是异步检索的并且无法同步可用的事实。因此,您必须使用异步工具来获取数据。在这种情况下,那就是.then() or await.

并且,要使用await,你必须处于支持它的环境中。现代浏览器确实支持它(并且您已经在使用fetch()这需要半现代的浏览器),但不是某些仍在使用的旧浏览器,因此这是一个考虑因素。在这种情况下,您可能应该使用.then().


另请注意,在此编码结构中:

json.then(function(getData){metaData = getData;});

您将承诺中的数据分配给更高范围的变量的位置是几乎总是一个警告信号您尝试在一个范围内使用数据,但您不知道数据实际可用的时间,并且执行了错误的操作。

您可以安全使用数据的唯一范围是INSIDE the .then()处理程序或在您从那里调用并将数据传递到的函数中。不要将其分配给更高的范围,然后尝试在该更高的范围中盲目使用。您不会知道数据何时真正有效。你只知道里面的计时信息.then()处理程序。

json.then(function(data){
    // use the data here
    // write the code in here that uses the data
    // or call some function here that you pass the data to
    processData(data);
});
// can't use the data here (it's not yet available)

有关此问题的进一步解释请参阅:如何从异步调用返回响应?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

获取JavaScript承诺值[重复] 的相关文章

随机推荐

  • 强制浏览器使用Javascript window.open 下载图像?

    有没有办法让图像在单击后立即下载 无需右键单击将图像另存为 我正在使用一个小的 Javascript 函数来调用下载页面 a href Click to download a 在 download php 页面中我有类似的内容 file G
  • 我的 CipherOutputStream 无提示地失败

    我正在尝试使用公钥加密 Java 中的一些二进制数据 如这个有用的页面上所述 http www junkheap net content public key encryption java 按照页面的指示 我使用以下命令创建了公钥和私钥
  • 打开重复 div 的图像预览

    我有一个上传图像并向该图像添加预览的功能 我有两个按钮 当我单击第一个按钮时 它会单击输入类型文件并打开它 第二个按钮会复制 div 如何才能我复制这个 div 并更改它的 id 或类 复制后 我怎样才能使按钮适用于新复制的 div 而不是
  • 序列化为 XML 时忽略父类

    当子类列表上有 XmlElement 时 是否有 JAXB 注释可以忽略父类 只是为了澄清 我想知道是否有更好的方法 而不是将所有父类 getter setter 标记为瞬态 然后必须返回子类并添加 getter setter 并将它们注释
  • 使用 PHP 删除缩写日期中的前导零

    我想知道是否有办法使用 PHP 将此日期格式 01 08 86 1986 年 1 月 8 日 更改为此格式 1 8 86
  • 使用谷歌地图API计算两点之间的距离?

    是否可以将两个纬度长点发送给谷歌来计算两者之间的距离 如果您想使用 v3 谷歌地图 API 这里是我使用的函数 注意 必须添加 libraries geometry到你的脚本源 现在的功能 calculates distance betwe
  • dplyr 总结输出 - 如何保存它

    我需要计算 150 个物种中每种鸟类繁殖活动观察结果的汇总统计数据 数据框包含物种 scodef 观察类型 codef 例如筑巢 和序号日期 自 1 月 1 日起的天数 自多年来收集数据以来 使用 dplyr 我得到了我想要的结果 libr
  • 检测 R 会话是否在启动时在 RStudio 中运行 [重复]

    这个问题在这里已经有答案了 我在终端和 RStudio 在 mac 和 linux 上 中都使用 R 想知道是否可以使用不同的 Rprofiles 为两者 或者最好使用相同的碱基 Rprofile但来源不同环境特定的调整脚本 我认为将以下代
  • Mongoid:使用多个数据库?

    我在 Rails 应用程序中使用 MongoDB 和 MongoID 某些模型如何成为同一服务器上不同 mongo 数据库的一部分 我该如何完成这样的事情呢 我之前在mysql上也遇到过同样的问题 但找不到合理的解决方案 有什么想法吗 最新
  • 包装 div 不会随内容 div 一起扩展

    我已经尝试了大约 15 种不同的教程和技巧来让我的页脚 页眉和三个内容 div 正常工作 我的页面将有一个页眉 左侧的导航栏 中间的内容 右侧的商店和 Google 广告以及下方的页脚 现在 在尝试了一些教程之后 我终于让页脚留在包装器下方
  • 我如何使用 Swift 向网站请求文本?

    因此 我正在制作一个 iOS 应用程序 并且制作了一个警报栏 该警报栏会在每次打开应用程序时根据网站上的文本进行更新 但是当我发出 HTTP 请求时 它只提供该网站的 HTML 如何从网页获取文本而不是 HTML 我正在使用下面的 Swif
  • 字体真棒快捷方式

    我在我的网络项目中使用 Awesome Font 是否有任何选项如何创建一堆图标的快捷方式 例如 我有circle thin图标 现在在页面上我想将三个图标放在一起 所以结果是OOO 但我不想放 3x 次 i class fa fa cir
  • opencv - 图像乘法

    嗨 我正在尝试玩一点 Mat 课 我想在两个图像之间进行乘积元素明智 MATLAB 的 c opencv 端口不相乘 这是我的代码 include
  • 使用 ecdf 图中的值创建一个表

    我正在尝试使用 ecdf 图中的值创建一个表 我在下面重新创建了一个示例 Data data mtcars Sort by mpg mtcars lt mtcars order mtcars mpg Make arbitrary ranki
  • 如何在 Windows 8 中以编程方式捕捉应用程序?

    如何以编程方式将 Windows 8 应用程序设置为快照视图 另外 如果屏幕分辨率为 1024 并且不允许捕捉会发生什么 调用这个函数会出现异常吗 回答您的问题 如何以编程方式将 Windows 8 应用程序设置为快照视图 看来这是不可能的
  • jQuery 对话框底部的箭头

    我在用着jQuery 对话框我需要在底部中心显示一个箭头提示jQuery Dialog像下面这样 我怎样才能做到这一点 一种想法是使用 after and before伪元素放置 2 个 CSS 三角形 参见CSS 三角形是如何工作的 彼此
  • IndexError:数组索引太多

    我知道有大量这样的线程 但所有这些线程都适用于非常简单的情况 例如 3x3 矩阵和此类事物 并且这些解决方案甚至不适用于我的情况 所以我试图绘制 G 与 l1 的关系图 这不是 11 而是 L1 数据位于我从 Excel 文件加载的文件中
  • 在Python中打开数百万个numpy.memmap

    我有一个由数百万个训练示例组成的数据库 每个都保存为自己的numpy memmap 是的 是的 我知道 但它们的大小不规则 我可能会修改我的设计 将类似大小的示例放在一个内存映射中 并向用户隐藏这一事实 尝试打开此数据库会导致我进入系统NO
  • 将 Windows 窗体表单的元素重置为初始化状态 (C#/.NET) [关闭]

    Closed 这个问题是无关 目前不接受答案 我正在建造一个Windows 窗体C 中的表单 面板中的各种元素一开始不可见 禁用或设置为 null 标签 组合框 网格等 当用户浏览并做出选择时 这些元素会被填充 选择等 这个想法是上传文件
  • 获取JavaScript承诺值[重复]

    这个问题在这里已经有答案了 我有一个 json 文件 我正在尝试读取其内容以在脚本中使用 我使用以下命令来获取 json const json fetch Data my data json then response gt respons