Javascript 如何从fetch函数返回对象?
我想创建一个外部函数来获取数据并返回结果。Javascript 如何从fetch函数返回对象?,javascript,node.js,reactjs,fetch,Javascript,Node.js,Reactjs,Fetch,我想创建一个外部函数来获取数据并返回结果。 但我不能让它工作,这是我的功能: //Request.js: import React from 'react' import { authHeader } from "../../jwt/_helpers/auth-header"; import { handleResponse } from "../../jwt/_helpers/handle-response"; export default func
但我不能让它工作,这是我的功能: //Request.js:
import React from 'react'
import { authHeader } from "../../jwt/_helpers/auth-header";
import { handleResponse } from "../../jwt/_helpers/handle-response";
export default function Request(method,request) {
const requestOptions = {
method: method,
withCrendtials: true,
headers: authHeader(),
};
fetch(process.env.REACT_APP_API + request, requestOptions)
.then(handleResponse)
.then(
(result) => {
console.log(result); // This returns an object
return result // This returns undefined
},
(error) => {
return error
}
);
}
然后我这样使用它:
// Main.js:
import Request from './Request';
let obj = Requete("GET", "/myPath/myQuery");
this.setState({foo: obj.items});
在我的Request.js文件中,我记录结果,得到正确的对象,然后返回它,在Main.js中得到该函数的未定义值如果我将我的代码从Request.js复制到Main.js,它就可以正常工作
但是我的代码变得不可读,因为获取查询几乎每行占用20行
有什么想法吗?尝试从导出的函数返回提取,然后在main.js中使用.then等待结果,然后在setState中使用它:
export default function Request(method, request) {
const requestOptions = {
method: method,
withCrendtials: true,
headers: authHeader(),
};
return fetch(process.env.REACT_APP_API + request, requestOptions)
.then(handleResponse)
.then(
(result) => {
console.log(result); // This returns an object
return result; // This returns undefined
},
(error) => {
return error;
}
);
}
解释是,导出的函数“Request”在提取完成之前返回,但由于没有return语句,它没有返回任何内容(
未定义)。添加return语句使它返回一些东西:第二个返回的承诺随后附加到初始获取。在main.js中,我们使用一个函数调用该承诺的.then方法,该函数在后者解析时给出该承诺的结果(obj)。然后它可以用它做它喜欢的事情。(您可以将.then函数的主体想象为存在于比周围代码更晚的时间段内,并且在提取完成之后)。返回结果
不会“返回未定义的”obj.items
未定义,因为obj
是一个未解析的Promise
实例。能否将代码添加到代码示例标记中?问题是请求
函数没有返回任何内容。then
回调返回的对象很好,但只会导致承诺解析。
// Main.js:
import Request from './Request';
Request("GET", "/myPath/myQuery").then(obj => {
this.setState({foo: obj.items});
})