【发布时间】:2020-04-27 19:09:13
【问题描述】:
我已经阅读了很多内容并观看了视频,但遗憾的是还没有找到我的问题的答案。这让我觉得我的问题被误导了,但我想知道为什么。 (注意:我确实发现 this question 很有帮助,但答案似乎没有解决我的好奇心。)
如果我理解正确的话,promise 的作用并不是这样的:
朋友:听着,到最后,我会给你买一台电脑。这是一个承诺。
我:太棒了!当你这样做的时候,我会做很多其他的事情。
朋友(在一天结束时):这是这个盒子。你只需要打开(处理)它。
我打开盒子,如果它是空的,我知道她的承诺已经失败(被拒绝)。如果里面有电脑,我知道她的承诺是成功的。而且,如果里面有一张纸条,上面写着“仍在努力履行这个承诺”,我知道她的承诺仍未完成。
相反,promise 的功能似乎是这样的:
朋友:听着,到最后,我会给你买一台电脑。这是一个承诺。
我:好的,我希望尽快使用那台计算机,因为我今天的所有任务都取决于它。我需要发送几封电子邮件,这将需要那台计算机。我需要研究获取请求,这也需要您的承诺。然后我需要在 StackOverflow 上问一个问题,这肯定需要那台机器。所以,我只是等到你的承诺成功或失败(或者你告诉我你需要更多时间)。
然后,朋友带着第一个场景中的同一个盒子回来,所以我需要先打开盒子(或处理承诺),然后才能执行任何进一步的任务。
那么,我的问题是,如果我们需要等待一个承诺响应,为什么该响应没有预先处理好?换句话说,为什么我的朋友递给我一个我必须打开的盒子,而不是递给我电脑或告诉我他们失败了(或者让我知道他们需要更多时间)?
当我发出提取请求时,我不能只使用响应。我需要先json() 它。或者,我需要先then() 和catch()。为什么我们返回承诺的数据而不是数据本身(当然,如果成功的话)?
我希望这个问题有意义。我期待我的假设得到纠正。
【问题讨论】:
-
您无法返回数据本身。该函数在数据可用之前很久就返回了。这就是 Javascript 中异步操作的工作方式。所以,在函数返回的时候,数据还没有到达。因此,您返回一个承诺,允许调用者将
.then()侦听器挂接到该承诺,并在数据实际准备好时收到通知。 -
"当我发出获取请求时,我不能只使用响应。我需要先
json()它" 但是如果你正在获取图像怎么办还是纯文本?你为什么要打电话给.json()并得到一个错误? 那 是你不希望它预先处理的原因 -fetch不知道你想对数据做什么。即使您正在获取 JSON,出于某种原因,您甚至可能仍希望它采用文本格式。例如,也许您只是获取一个 .json 文件并将其存储在数据库中。 -
@VLAZ,我并不是要暗示每个响应都会通过 .json(),但是在重新阅读我的问题之后,这并不清楚。无论哪种方式,您的观点都是绝对有效的,谢谢!
标签: javascript promise fetch