[英]React Native get value from promises after fetch data finished
我试图从另一个调用 fetch promises 的函数中获取值,但它返回 undefined,我认为问题是结果不会等待被调用函数的进程直到它完成。
这是代码:
var myConnection = require('../components/connection');
var RequestToken = React.createClass({
getInitialState: function() {
return {
};
},
componentDidMount: function(){
AsyncStorage.getItem('token').then((value) => {
if(typeof value != null){
this.setState({"token": value});
// call this function
this.catchToken(value);
}
}).done();
},
catchToken: async function(token){
try{
var URL = "http://someurl.com/";
var params = {
token:token
}
let val = await myConnection.now(URL,params);
this.setState({
responseAPI:val
});
// returned undefined
console.error(this.state.responseAPI);
}catch (e){
console.error(e);
}
}
});
和 connection.js
function timeout(ms, promise) {
return new Promise(function(resolve, reject) {
setTimeout(function() {
reject(new Error("Connection timeout"))
}, ms);
promise.then(resolve, reject);
});
}
var myConnection = {
now: async function(URL,params){
//return "OK";
var formData = new FormData();
for (var k in params) {
formData.append(k, params[k]);
}
timeout(10000, fetch( URL, {
method: 'POST',
headers: {
'Accept': 'application/json',
'Content-Type': 'multipart/form-data'
},
body: formData
})).then(
(response) => response.json()
).then((res) => {
// result data
return res;
}).catch((error) => {
console.error(error);
}).done();
}
};
module.exports = myConnection;
有人能解释一下函数处理完成后如何获取返回值吗?
谢谢
您应该在组件中以这种方式处理承诺:
myConnection.now(URL,params)
.then(val => {
this.setState({
responseAPI:val
});
})
.catch(error =>{
console.error(error);
});
在 api 方面,您需要返回一个承诺(代码中的超时函数):
var myConnection = {
now: async function(URL,params){
//return "OK";
var formData = new FormData();
for (var k in params) {
formData.append(k, params[k]);
}
//You need to return the promise
return timeout(10000, fetch( URL, {
method: 'POST',
headers: {
'Accept': 'application/json',
'Content-Type': 'multipart/form-data'
},
body: formData
})).then(
(response) => response.json()
).then((res) => {
// result data
return res;
}).catch((error) => {
console.error(error);
}).done();
}
};
超时应该拒绝或解决承诺,如果 fetch 调用在这里,则更简单:
function timeout(ms, promise) {
return new Promise(function(resolve, reject) {
setTimeout(function() {
reject(new Error("Connection timeout"))
}, ms);
fetch( URL, {
method: 'POST',
headers: {
'Accept': 'application/json',
'Content-Type': 'multipart/form-data'
},
body: formData
})).then(
(response) => response.json()
).then((res) => {
// result data
resolve(res);
}).catch((error) => {
reject(error);
}).done();
});
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.