我有一个 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(使用前将#替换为@)