2017-04-10 75 views
2

我有點難住。我忘記了如何做到這一點。 我有一個叫做ext.get()的函數,它需要一個url的參數。它從url獲取響應。 ext.get()函數旨在將響應作爲json返回。我不認爲它是這樣做的。如何使用fetch從promise回調中返回return?

ext.get = (url) => { 
     let myHeaders = new Headers(); 

     let options = { 
      method: 'GET', 
      headers: myHeaders, 
      mode: 'cors' 
     }; 

     //fetch get 

     fetch(url, options).then(response => { 
      console.log(JSON.stringify(response.json())) 
      return JSON.stringify(response.json()) 

     }); 

    }; 
+2

'返回讀取(...' – Ryan

+1

具體[這個答案](HTTP: //stackoverflow.com/a/30180679/542251) – Liam

+1

注意:'ext.get'不能返回除Promise之外的任何內容 - 如果你想讓它工作 –

回答

4

如果您需要的響應,JSON - 有效地考慮response.json()一樣response.text().then(txt => JSON.parse(txt))

return fetch(url, options).then(response => response.text()); 

因此,在全功能會

ext.get = (url) => { 
    let myHeaders = new Headers(); 
    let options = { 
     method: 'GET', 
     headers: myHeaders, 
     mode: 'cors' 
    }; 
    return fetch(url, options).then(response => response.text()); 
}; 

你AREN這樣」 t本質上是做JSON.stringify(JSON.parse(json)) ...這只是json

不過,我懷疑你想要一個純醇」 JavaScript對象

ext.get = (url) => { 
    let myHeaders = new Headers(); 
    let options = { 
     method: 'GET', 
     headers: myHeaders, 
     mode: 'cors' 
    }; 
    return fetch(url, options).then(response => response.json()); 
}; 

然後,您可以使用它作爲:

ext.get('url').then(result => { 
    // result is the parsed JSON - i.e. a plan ol' javascript object 
}); 
0

您正在使用fetch,它是一個異步API。這意味着你的函數也必須是異步的 - 即它必須返回一個Promise。 (你可以用回調做到這一點,但這是2017年...)

你不能從函數返回JSON,因爲函數將在服務器響應可用之前返回。您必須在呼叫代碼中使用then(或await)返回承諾並進行處理。

這樣做的最簡單和最好的方法是簡單地返回調用後的fetch調用結果。您不想解析JSON,而是將其作爲字符串返回。這就要求response.text()電話:

ext.get = (url) => { 
    let myHeaders = new Headers(); 

    let options = { 
     method: 'GET', 
     headers: myHeaders, 
     mode: 'cors' 
    }; 

    //fetch get 

    return fetch(url, options).then(response => response.text()); 
}; 

而且你的調用代碼:

ext.get('http://example.com').then((response) => { 
    console.log(response); // or whatever 
}); 

await

let response = await ext.get("http://example.com");