获取 JavaScript 承诺值

ncl*_*cl3 4 javascript promise fetch-api

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

const json = fetch('Data/my_data.json').then(response => response.json());
Run Code Online (Sandbox Code Playgroud)

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

json.then(function(getData){metaData = getData;});
Run Code Online (Sandbox Code Playgroud)

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

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

感谢您的任何见解!

jfr*_*d00 5

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

您必须使用.then()await来获取承诺之外的数据。数据是异步检索的,因此唯一需要等待的就是使用.then()or await。而且,如果使用await,它必须位于async函数内部。

虽然 Promise 和 Promiseasync/await有助于管理异步操作,但它们无法改变数据是异步检索的并且无法同步可用的事实。因此,您必须使用异步工具来获取数据。在本例中,即.then()await

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


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

json.then(function(getData){metaData = getData;});
Run Code Online (Sandbox Code Playgroud)

将承诺中的数据分配给更高范围的变量几乎总是一个警告信号,表明您试图在不知道数据实际可用的时间的范围内使用数据,并且做错事。

您可以安全使用数据的唯一范围是在处理程序内部.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)
Run Code Online (Sandbox Code Playgroud)

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

  • @JuanMendes - 我的答案中已经多次提到“await”作为一种可能性。而且,由于 OP 没有显示包含的代码以及他们试图如何处理这些数据,我们无法真正评估“await”对于他们的情况有多大用处。这取决于。要点是数据永远不会同步可用。 (2认同)