gpt4 book ai didi

javascript - 递归异步/等待请求不返回调用函数

转载 作者:行者123 更新时间:2023-12-01 01:19:26 24 4
gpt4 key购买 nike

只要收到的响应具有length === 0,我就会使用async/await执行递归请求。问题是,当某些请求返回所需的数据时, promise 的 resolve(data); 部分似乎不起作用。

因此,在我的代码中,我已经达到了可以进行多次递归调用并最终收到长度不为 0 的响应的程度。

注意:Github 中发布了大量 API key 如果您想测试代码。

var apiKey = "yourApiKey";
var url = "https://api.nasa.gov/mars-photos/api/v1/rovers/curiosity/photos?sol=";

function requestData(url) {
return fetch(url).then(response => {
if(response.ok) {
return response.json().then(data => {
return Promise.resolve(data);
});
} else {
return Promise.reject(response.status);
}
});
}

function NasaRequest(sun, limit, frecuency) {
return new Promise(async (resolve, reject) => {
var data = await requestData(url + sun + "&api_key=" + apiKey);
if(data.photos.length === 0 && !limit) {
setTimeout(async () => {
console.log("Delay for next request (sun " + sun + "): ", frecuency);
return await NasaRequest(sun - 1, limit, frecuency);
}, frecuency);
} else {
console.log("Resolve data:", data); // Code acutally reaches this point
resolve(data); // But this doesn't seem to work
}
});
};

async function init() {
try {
const currentValue = await NasaRequest(2175, false, 2000);
console.log("currentValue:", currentValue); // I want to reach this point, but is like the promise never returns
}catch(err){
console.error(err);
}
}

init();

在那一刻,我想将响应中的数据返回到调用 init() 函数,因为我使用 resolve(data);。但似乎不起作用。

我做错了什么?

最佳答案

问题出在 setTimeout 上。当您调用 setTimeout 时,它会立即返回并隐式返回 undefined。此时子序列的返回并不重要。如果您只想暂停,然后继续尝试这样的事情

async function requestData(url) {
var response = await fetch(url);
if (response.ok) {
return response.json()
} else {
throw new Error(response.status);
}
}

function sleep(ms) {
return new Promise((resolve) => {
setTimeout(resolve, ms);
});
}

async function nasaRequest(sun, limit, freq) {
var data = await requestData(url + sun + "&api_key=" + apiKey);
if (data.photos.length === 0 && !limit) {
await sleep(freq);
console.log("Delay for next request (sun " + sun + "): ", freq);
return await nasaRequest(sun - 1, limit, freq);
} else {
console.log("Resolve data:", data);
return data;
}
};

async function init() {
try {
const currentValue = await nasaRequest(2175, false, 2000);
console.log("currentValue:", currentValue);
} catch (err) {
console.error(err);
}
}

init();

我添加了一个简单的sleep函数来处理暂停。我还修改了 requestData(删除了 then 和 Promise 部分)。请注意,使用这种递归方法可能会遇到堆栈溢出。为了避免这个问题,您可以简单地使用循环并检查您的 limit 变量。

关于javascript - 递归异步/等待请求不返回调用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54370252/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com