我有第一个异步功能
fetch("https://api.priceapi.com/v2/jobs", {
body: body,
headers: {
"Content-Type": "application/x-www-form-urlencoded"
},
method: "POST"
}).then((response) => {
return response.json();
}).then((data) => {
return fetchRepeat(data.job_id)
})
第二个递归异步函数。
function fetchRepeat(id){
fetch("https://api.priceapi.com/v2/jobs/"+ id +"/download.json?token=" + priceapisecret.secret)
.then((response) => {
return response.json()
}).then((data) =>{
if(data.status == "finished"){
var bookdata = {
title: data.results[0].content.name,
price: data.results[0].content.price
}
return bookdata;
}
else{
fetchRepeat(id)
}
})
}
我希望能够在第一个异步功能中访问bookdata。我该怎么办?
答案 0 :(得分:1)
要谈论退货,您的fetchRepeat
需要退回承诺。结果并非如此,返回undefined
。最后一个then
也不返回递归的值,因此也解析为undefined
。
这是一个有效的版本:
function fetchRepeat(id) {
// return the promise
return fetch(`https://api.priceapi.com/v2/jobs/${id}/download.json?token=${priceapisecret.secret}`)
.then(response => response.json())
.then(({ status, results: [{ content: { name: title, price } }] = [{ content: {} }] }) =>
(status === 'finished' ? { title, price } : fetchRepeat(id))); // return result of recursion
}
现在,我让ESLint处理格式,并且由于我使用airbnb,因此它更喜欢进行结构分解。最后一个then
中的错误很明显,因为ELSint抱怨一致的回报。我敦促您使用linter和IDE来强制执行编码样式,以减少代码中的错误并使其他人更容易阅读。