gpt4 book ai didi

javascript - (JS) 对 Promises 和 fetch 很困惑

转载 作者:行者123 更新时间:2023-11-30 11:25:22 24 4
gpt4 key购买 nike

我看过很多关于 fetch promise 的 youtube 视频/类(class)/“书籍”,但它们没有帮助。这只是令人困惑。

我明白这一点:

fetch("some url/file")   // get "data" from some API and it returns a promise

.then( res => res.json()) // this is a promise but not the raw data that we need

.then(data => console.log(data) // with this I will actually access the actual data

.catch( err => console.log(err) // this is if errors exists but ONLY if It can't open the actual site, like their server is dead or whatever, I know that with an IF statements I can check if the status is 200 and that can work with errors.

我正在阅读更多关于它的信息,一个网站说“新的 Promise() 构造函数应该只用于遗留的异步任务,比如 setTimeout 或 XMLHttpRequest 的使用。一个新的 Promise 是用 new 关键字创建的,promise 提供 resolve并拒绝提供的回调函数:“”,但是 resolve 和 reject 呢?我什至需要它们吗?

然后,我在 stackoverflow 上读到,如果你正在获取,则不需要做出“新 promise ”,因为获取已经返回了一个 promise (尽管在 stackoverflow 示例中,人们是这样写的,在一个变量中"

function get(url) {

console.log('Making fetch() request to: ' + url);

let promise = new Promise((resolve, reject) => {

fetch(url).then // etc etc
")

所以主要的问题是:

  1. “新 promise ”怎么样?它是什么?我需要它吗?什么时候?和我谈谈。

  2. 如果我需要“new Promise”,我是将它放入变量中 (let test = new Promise) 还是在函数中返回它 (function test(){ return new Promise})//etc等等,有什么区别?

  3. 如果我需要“new Promise”,我什么时候 resolve 和 reject?我要解决/拒绝什么?

如果您想通过深入链接回答这些问题,请随意解释。

感谢您的宝贵时间。

最佳答案

您对该获取代码的评论大部分是正确的,除了因为 catch 位于链的末尾,它不是接收来自原始代码的失败获取;如果在它之前的 then 回调之一中抛出错误(或者从最终拒绝的回调返回的 promise ),它会看到该错误。例如,使用此代码,如果 fetch 成功,则 catch 处理程序接收到由 then 回调抛出的错误:

fetch(/*...*/)
.then(response => throw new Error("fail"))
.catch(err => {
// Either gets error from `fetch` or failure from `then` above
});

同样,在您引用的代码中,如果 response.json() rejects 返回的 promise (无法读取正文、无效的 JSON 等),您的 catch 处理程序将看到该拒绝(错误)。

...what about resolve and reject? Do I even need them?

不在那个代码中,不。

1. What about "new Promise"? What is it? Do I need it? When?

当您还没有 promise 并且需要 promise 链时,您需要它。当您已经有了 promise (例如来自 fetch 的 promise )并且需要 promise 链时,您不需要它。

2. If I need "new Promise", do I put it into a variable (let test = new Promise) or do I return it in a function (function test(){ return new Promise}) //etc etc, what is the difference?

在这方面,promises 没有什么特别之处。如果以后需要在同一范围内引用它,请使用变量。如果没有,您可以直接返回(如果返回)。

3. If I need "new Promise", when do I resolve and reject? WHAT do I resolve/reject?

当您正在执行的任何非 promise 事件完成时,您调用 resolve。您将事件生成的值(如果有的话)传递给它。

当您正在执行的任何非 promise 事件失败时,您调用reject。你传递给它的东西和你在 throw 中使用的一样:某种错误。 (通常通过将其创建为实际错误,例如 new Error(...))。

更多关于 new Promise 的阅读:What is the explicit promise construction antipattern and how do I avoid it?

关于javascript - (JS) 对 Promises 和 fetch 很困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48249254/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com