亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

請問為什么json()返回一個承諾?

請問為什么json()返回一個承諾?

守候你守候我 2019-10-21 12:12:31
為什么json()返回一個承諾?我一直在胡鬧fetch()最近,API注意到了一些有點古怪的東西。let url = "http://jsonplaceholder.typicode.com/posts/6";let iterator = fetch(url);iterator  .then(response => {       return {           data: response.json(),           status: response.status      }   })   .then(post => document.write(post.data));;post.data返回Promise對象。http://jsbin.com/wofulo/2/edit?js,輸出但是,如果它寫成:let url = "http://jsonplaceholder.typicode.com/posts/6";let iterator = fetch(url);iterator  .then(response => response.json())   .then(post => document.write(post.title));;post這是一個標準Object它可以訪問title屬性。http://jsbin.com/wofulo/edit?js,輸出所以我的問題是:為什么response.json返回對象文字中的承諾,但返回值如果剛剛返回?
查看完整描述

3 回答

?
泛舟湖上清波郎朗

TA貢獻1818條經驗 獲得超3個贊

為什么response.json還承諾?

因為你收到了response只要所有標題都到了。呼叫.json()獲取尚未加載的HTTP響應主體的另一個承諾。另見為什么JavaScriptFETCH API中的響應對象是一個承諾?.

如果我從then處理程序?

因為承諾就是這樣運作的..從回調中返回承諾并使其被采納的能力是它們最相關的特性,它使它們無需嵌套就可以鏈接。

你可以用

fetch(url).then(response => 
    response.json().then(data => ({
        data: data,
        status: response.status    })).then(res => {
    console.log(res.status, res.data.title)}));

或任何其他訪問先前承諾的方法會導致.Then()鏈等待JSON身體后獲得響應狀態。



查看完整回答
反對 回復 2019-10-22
?
撒科打諢

TA貢獻1934條經驗 獲得超2個贊

這種差異是由于承諾的行為,而非承諾。fetch()特別是。

.then()回調返回額外的Promise,下一個.then()鏈中的回調本質上是與該承諾綁定在一起的,它接受它的決心或拒絕它的實現和價值。

第二個片段也可以編寫為:

iterator.then(response =>
    response.json().then(post => document.write(post.title)));

無論是這種形式還是你的,post返回的承諾所提供的response.json().


當你回到平原Object不過,.then()認為一個成功的結果并立即解決,類似于:

iterator.then(response =>
    Promise.resolve({
      data: response.json(),
      status: response.status    })
    .then(post => document.write(post.data)));

post在本例中,只是Object您創建的,其中包含一個Promise在其data財產。等待這一承諾的實現仍然是不完整的。



查看完整回答
反對 回復 2019-10-22
?
動漫人物

TA貢獻1815條經驗 獲得超10個贊

而且,幫助我理解您所描述的這個特定場景的是承諾API。文獻資料,特別是在哪里,它解釋了承諾是如何由then方法將根據處理程序FN返回:

如果處理程序函數:

  • 返回一個值,然后以返回的值作為它的值來解析返回的承諾;
  • 拋出一個錯誤,然后返回的承諾以拋出的錯誤作為其值而被拒絕;
  • 返回一個已經解決的承諾,然后以該承諾的價值作為其價值來解決該承諾所返回的承諾;

  • 返回一個已經被拒絕的承諾,然后返回的承諾以該承諾的值作為其價值而被拒絕。
  • 返回另一個掛起的承諾對象,此時返回的承諾的解析/拒絕將在處理程序返回的承諾的解析/拒絕之后。此外,到那時返回的允諾的值將與處理程序返回的允諾的值相同。



查看完整回答
反對 回復 2019-10-22
  • 3 回答
  • 0 關注
  • 430 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號