使用 promise 与 async/await 时以不同方式获取解析 json

问题已解决。这实际上是一个完全不同的问题,与 fetch/ajax/etc 无关,而是通过引用更新了不需要的对象。


误导我的是,我使用的实际代码在 console.log 之后有一个后续步骤。随后的步骤改变了数据 json,结果 console.log 的值也改变了。它是通过深度克隆 json 来修复的。


我仍然不确定的是为什么console.log 在数据更改之前出现但受到影响——猜测console.log 在这种情况下是异步的。


=================== 原文:


超级奇怪的问题。我的前端需要从后端获取数据,所以我使用了 fetch 的 Promise 链式风格,例如


fetch(myUrl, {credntials: 'include'})

  .then(res=>{

    if(res.status==200){

      return res.json()

    }

    else{

      return null

    }

  })

  .then(json=>{

    if(json){

      console.log(json)

    }

  })

似乎工作正常,我得到了一些数据。但是,我注意到解析的 JSON 与来自后端的预期响应不同。例如,后端输出{'a': {'aa':1, 'bb':1}},并且解析res.json()给了我类似的东西{'a': {'aa':2, 'bb':1}}。更改似乎不一致,res.json()一次又一次尝试时我得到了不同的价值。


然后我尝试了几种不同的方式来获取数据:


1) 在浏览器地址栏中输入 url => 得到正确的数据


2) 使用 jQuery ajax 方法而不是 fetch => 得到正确的数据


3) 将承诺链更改为 async/await => 这也得到了正确的数据!


let resp = await fetch(myUrl, {credentials: 'include'})

let json = await resp.json()

console.log(json)

4)尝试了承诺链式提取,仍然不正确的数据!


超级迷茫。我使用 fetch 错误吗?它是一个错误吗?是浏览器吗?是polyfill(我正在使用"whatwg-fetch": "3.0.0",但在Chrome,Mac上,理论上polyfill应该不会影响任何东西)?是响应头设置(Django、JsonResponse)吗?有没有人有类似的经历?


PIPIONE
浏览 204回答 2
2回答

慕森卡

抱歉,原始问题具有误导性。找到真正原因并解决。请参阅问题中 11/28 的更新。

红糖糍粑

也许这是一个错字,您在此处列出的两个请求之间的凭据拼写不同:fetch(myUrl, {**credntials:** 'include'})与这里:let resp = await fetch(myUrl, {**credentials:** 'include'})如果这不能解决问题,请告诉我,但这似乎不太可能是 async/await 与常规 promise 的区别。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript