javascript - fetch() 调用不返回任何数据
问题描述
我的 fetch() 调用无法正常工作时遇到问题。我有一个在这个函数中调用自身的递归方法,但是一旦它通过 if 语句,数据本身就不会被解析为下面的 .then() 调用。我想在这个函数中保留递归方法。因为此函数正在调用的系统会将 data.result 更改为不为空的不同结果。我只是不知道什么时候会发生,因此这就是我使用递归方法的原因。
var someToken = "actually token";
function getResult(getToken) {
return new Promise((resolve, reject) => {
fetch(url, {
headers: {
"Authorization": something,
"Jenkins-Crumb": getToken
},
redirect: 'follow',
}).then(response => {
return response.json()
}).then(data => {
if (data.result == null) {
console.log('retrieving data')
getResult(getToken)
} else if (data.result == "SUCCESS") {
console.log('success')
resolve(data)
}
}).catch(err => {
reject(err)
})
})
}
getResult(someToken).then(data => {
console.log(data)
}).catch(err => console.log(err))
解决方案
您需要返回递归调用getResult
并避免显式 Promise 构造反模式(只是Promisereturn
代替):
function getResult(getToken) {
return fetch(url, {
headers: {
"Authorization": something,
"Jenkins-Crumb": getToken
},
redirect: 'follow',
})
.then(response => response.json())
.then(data => {
if (data.result == null) {
console.log('retrieving data');
return getResult(getToken); // <-----------------------------
} else if (data.result == "SUCCESS") {
console.log('success');
return data; // <-------------------------------------------
}
// What if data.result is neither null nor SUCCESS? <--------
});
}
getResult(someToken).then(data => {
console.log(data);
}).catch(err => console.log(err))
现场演示:
const getUrl = () => Math.random() < 0.25 ? 'data:,{"result":"SUCCESS"}' : 'data:,{}';
function getResult(getToken) {
return fetch(getUrl(), {
headers: {
"Authorization": 'something',
"Jenkins-Crumb": getToken
},
redirect: 'follow',
})
.then(response => response.json())
.then(data => {
if (data.result == null) {
console.log('retrieving data');
return getResult(getToken); // <-----------------------------
} else if (data.result == "SUCCESS") {
console.log('success');
return data; // <-------------------------------------------
}
// What if data.result is neither null nor SUCCESS? <--------
});
}
getResult('someToken').then(data => {
console.log(data);
}).catch(err => console.log(err))
您还应该考虑 - 您的if
andelse if
末尾的 s.then
可能不包含所有可能性。如果data.result
既不是null
也不是'SUCCESS'
呢?鉴于您当前的逻辑,getResult
调用将导致在data
消费者undefined
中。如果有可能发生这种情况,您可能希望在这种情况下抛出错误或其他东西。
if (data.result == null) {
console.log('retrieving data')
return getResult(getToken) // <-----------------------
} else if (data.result == "SUCCESS") {
console.log('success')
return data; // <-----------------------
}
throw new Error('data.result is neither null nor 'SUCCESS'');
推荐阅读
- javascript - ReactJS:覆盖在另一个组件上的可折叠侧边栏
- django - 如何在已部署的 Django 站点中使用错误警报系统
- sas - SAS-如何计算某月前10年的观察次数
- loopback4 - 使用 2 个数据源时,如何使用附加到所选数据源的存储库注入拦截器?
- docker - 无法从 Fargate 任务中检索容器内的 AWS_CONTAINER_CREDENTIALS_RELATIVE_URI
- python - 在 Windows 命令行中进行漂亮的打印
- flutter - RangeError : RangeError(index) : 无效值 : 仅有效为 0: 3
- ruby - 构建一个倒置的日期数组
- java - 在测试中对控制器的服务调用未正确更新字段
- firebase - Firebase 函数路由到特定的 http 方法