2017-04-10 149 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");