我有一个json文件,我正在尝试读取脚本中使用的内容.我正在使用以下内容来获取json:
const json = fetch('Data/my_data.json').then(response => response.json());
当我这样做时,我在控制台中查看了json对象,我看到它是一个包含了文件中实际json对象的返回的Promise(已解决状态).但是,您不能直接访问promisevalue.您必须再次使用then语句,所以我使用了这个:
json.then(function(getData){MetaData = getData;});
MetaData对象未设置为原始诺言的值.直到第二次完成时才设置它.尽管在最初返回的承诺中,该信息已经可用.
是否可以在没有第二个then语句的情况下获得原始的promisevalue或
我使用第二个then语句错误地访问了诺言.
感谢您的任何见解!
解决方法:
Is it possible to get the original promisevalue without the 2nd then statement or am I accessing the promise incorrectly with the 2nd then statement.
您必须使用.then()或wait来使数据超出承诺.数据是异步检索的,因此使它脱离承诺的唯一等待是使用.then()或await.而且,如果使用await,则必须在异步函数中.
虽然promise和async / await对于管理异步操作很有帮助,但是它们不能更改以下事实:数据是异步检索的,并且将无法同步使用.因此,您必须使用异步工具来获取数据.在这种情况下,即为.then()或await.
而且,要使用await,您必须处于支持它的环境中.现代浏览器确实支持它(并且您已经在使用需要半现代浏览器的fetch()),但是某些浏览器仍未使用某些较旧的浏览器,因此需要考虑.在这种情况下,您可能应该使用.then().
另外,请注意,在此编码结构中:
json.then(function(getData){MetaData = getData;});
将承诺中的数据分配给更高范围的变量的地方几乎总是一个警告信号,表示您正在尝试在不知道数据实际可用时间的时间范围内使用该数据,并且做错了事.
您可以安全使用数据的唯一作用域是在.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)
有关此问题的进一步说明,请参见:How do I return the response from an asynchronous call?